Как заставить MVC 4 Razor Html.Raw работать для назначения в HTML в тегах script

Для проекта я использую 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="&lt;%=this.Id%&gt;"></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>

...чтобы максимально сохранить разметку нетронутой.


person Yarune    schedule 28.11.2012    source источник
comment
Почему вы не используете @Html.DropDownList(id)?   -  person Michael Dunlap    schedule 28.11.2012
comment
У меня та же проблема, но с ‹img [email protected](path) /› он трансформируется & в   -  person Rogerio Chaves    schedule 24.06.2013
comment
Для этого есть тикет и исправление на github: github.com/Antaris/RazorEngine/issues/181   -  person cheesemacfly    schedule 26.11.2014


Ответы (1)


ИЗМЕНИТЬ После правильного прочтения предоставленного кода:

Это похоже на ошибку. Это как-то связано с id-атрибутом. Измените атрибут на что-то другое, и это сработает.

@if(true) 
{   
    <select data-id="@Html.Raw(id)"></select>
}

Очевидно, что это не решение, а только проверка. Ваш пример 4 более или менее подразумевает, что это не по замыслу, иначе он тоже должен потерпеть неудачу.

person Tor-Erik    schedule 28.11.2012
comment
Спасибо, но это то же самое, что и #1, но с дополнительными тегами <text>. №4 без if. if должен быть там... - person Yarune; 28.11.2012
comment
Извините, я неправильно понял вопрос, я немного протестировал и обновил свой ответ. Если кто-то другой не может дать лучшее объяснение, я бы сказал, что вы нашли ошибку. - person Tor-Erik; 28.11.2012