Для проекта я использую jqote для шаблонов в JavaScript и HTML, сгенерированных MVC 4 с Razor.
Пожалуйста, взгляните на следующий код в 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 того, что там есть.
Вопрос: Кто-нибудь знает, почему? Это ошибка или так задумано?
Без тегов script это работает. Но нам нужны теги script, потому что нам нужен шаблон в 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>
...чтобы максимально сохранить разметку нетронутой.