好吧,我让这个工作,但我不确定这是多么可怕的黑客.任何人都可以告诉我,如果我做了什么是好的,为什么?
我需要在我的Razor和JavaScript之间共享一个模板,因此可以使用服务器端和另一个客户端.所以,这就是我做的:
Func<dynamic, HelperResult> sampleTemplate =
@<span>Sample markup @item.Something</span>;
然后,我在我的视图中使用了我的模板,如下所示:
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对我来说是一个坏主意.我个人会写一个控制器:
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>
然后,如果我需要在强类型视图中使用它,我只需使用编辑器模板:
@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>