好吧,我让这个成功了,但我不确定这是多么糟糕的黑客攻击。谁能告诉我我所做的是否正确,为什么?
我需要在我的 Razor 和 JavaScript 之间共享一个模板,这样一个人就可以在服务器端和另一个客户端使用它。所以,这就是我所做的:
Func<dynamic, HelperResult> sampleTemplate =
@<span>Sample markup @item.Something</span>;
然后,我在我的 View 中使用了我的模板,如下所示:
for(int idxSample = 0; idxSample < Model.Number; idxSample++) {
@sampleTemplate(new { Something = "" })
}
对于 javascript,我这样做了:
<script type="text/javascript">
var someJsTemplate = "" +
<r><[!CDATA[@sampleTemplate(new { Something = "" })]]></r>;
</script>
所以我以后可以在需要时附加 someJsTemplate
。那么,判决书是什么?有没有人看到更好的方法?或者这样可以吗?
编辑:
现在我不能用这个了。虽然它在 FireFox 中运行良好,但 Chrome 不允许我的破解。有帮助吗?
最佳答案
在我看来,在服务器端代码中存储 HTML 是个坏主意。我个人会写一个 Controller :
public class TemplatesController: Controller
{
[ChildActionOnly]
public ActionResult Index(Item item)
{
return View("~/Views/Shared/EditorTemplates/Item.cshtml", item);
}
}
和包含标记的部分(~/Views/Shared/EditorTemplates/Item.cshtml
):
@model AppName.Models.Item
@{
Layout = null;
}
<span>Sample markup @Model.Something</span>
然后,如果我需要在强类型 View 中使用它,我会简单地使用一个编辑器模板:
@Html.EditorFor(x => x.Items)
在 javascript 中:
<script type="text/javascript">
var someJsTemplate = '@HttpUtility.JavaScriptStringEncode(Html.Action("index", "templates", new { something = "abc" }).ToHtmlString())';
</script>
为了稍微简化这个 javascript 调用,您可以编写一个帮助程序:
public static class HtmlExtensions
{
public static MvcHtmlString Template(this HtmlHelper htmlHelper, object item)
{
return MvcHtmlString.Create(
HttpUtility.JavaScriptStringEncode(
htmlHelper.Action("index", "templates", item).ToHtmlString()
)
);
}
}
然后:
<script type="text/javascript">
var someJsTemplate = '@Html.Template(new { something = "abc" })';
</script>
关于javascript - Razor 模板到 javascript 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4636000/