对于一个项目,我使用 jqote 在由 MVC 4 和 Razor 生成的 JavaScript 和 HTML 中进行模板化。
请查看 HTML 和 Razor 中的以下代码:
<script id="testTemplate" type="text/html">
<p>Some html</p>
@{string id = "<%=this.Id%>";}
<!-- 1 -->
@if(true)
{
@Html.Raw(@"<select id="""+id+@"""></select>")
}
<!-- 2 -->
@if(true)
{
<select id="@Html.Raw(id)"></select>
}
<!-- 3 -->
@Html.Raw(@"<select id="""+id+@"""></select>")
<!-- 4 -->
<select id="@Html.Raw(id)"></select>
<!-- 5 -->
<select id="<%=this.Id%>"></select>
</script>
输出是这样的:
<script id="testTemplate" type="text/html">
<!-- 1 -->
<select id="<%=this.Id%>"></select> <!--Good!-->
<!-- 2 -->
<select id="<%=this.Id%>"></select> <!--BAD!-->
<!-- 3 -->
<select id="<%=this.Id%>"></select> <!--Good!-->
<!-- 4 -->
<select id="<%=this.Id%>"></select> <!--Good!-->
<!-- 5 -->
<select id="<%=this.Id%>"></select> <!--Good!-->
</script>
现在,问题在于<!-- 2 -->
. 人们会期望Html.Raw
在这里踢,但不知何故它没有。或者 Razor 想要对其中的内容进行 HtmlEncode。
问题是:有人知道为什么吗?这是一个错误还是设计使然?
没有脚本标签它可以工作。但是我们需要脚本标签,因为我们需要在 JavaScript 中进行模板化。
硬编码它可以工作,但我们需要使用一个变量,因为它并不总是一个模板。
如果没有@if
它,它就可以工作,但它就在那里,我们需要它。
解决方法
这些行给出了类似的良好输出:
@if(true)
{
<select id= "@Html.Raw(id)"></select>
}
@if(true)
{
<select id ="@Html.Raw(id)"></select>
}
@if(true)
{
<select id @Html.Raw("=")"@Html.Raw(id)"></select>
}
我们计划这样做:
<script id="testTemplate" type="text/html">
@{string id = @"id=""<%=this.Id%>""";}
@if(true)
{
<select @Html.Raw(id)></select>
}
</script>
...尽可能保持标记完整。