剃刀模板到javascript字符串

好吧,我让这个工作,但我不确定这是多么可怕的黑客.任何人都可以告诉我,如果我做了什么是好的,为什么?

我需要在我的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>
点赞