Механизм просмотра Razor автоматически применяет кавычки?
Я сейчас привык к бритве, но я не могу понять, почему правильный синтаксис правильный?
<li @(active ? "class=active" : "")>
@Html.ActionLink(item.Text, item.TargetAction, Model.Controller)
</li>
Как вы можете видеть, я условно применяю класс (и я написал его таким образом, чтобы тег класса не генерировался, если bool active == false).
То, что я не могу понять, это то, что тогда генерируют правильные цитаты, которые дают:
<li class="active"><a href="/">Home</a></li>
<a href="/">Home</a>
</li>
Как-то волшебно разбирается в цитировании, но я не могу найти ссылки на статьи о бритве, чтобы предположить, что это ожидается, поэтому мне интересно, полагается ли оно на нарушение поведения. Если я добавляю одиночные или двойные кавычки в строку вокруг слова "active", как вы ожидали бы, если выкрутите html, я получаю:
<li class="'active'">
<a href="/">Home</a>
</li>
или
<li class="active">
<a href="/">Home</a>
</li>
Почему это работает так, и мой код правильный (в отличие от простого функционирования)?
Ответы
Ответ 1
Razor автоматически HTML-экранирует весь вывод кода.
Это можно предотвратить, написав @Html.Raw(...)
В качестве альтернативы вы можете поместить кавычки в литеральный текст:
<li class="@(active ? "active" : "")>
Ваш пример работает, потому что на самом деле у вас нет кавычек.
Сгенерированный HTML-источник читает <li class=active>
.
Ответ 2
Просто натолкнись на это, так что мысль ответит - SLaks выглядит правильно с помощью Html.Raw, но OP также верен в том, что второй метод не выглядит так: "s get encoded.
Мое решение было:
<[email protected](active ? Html.Raw(" class=\"active\"") : null)>
Ответ 3
Просто натолкнулся на это странное поведение. Логически следующее должно работать.
@(Model.IsTablet ? "data-options='is_hover: false'" : "")
но отображается как
data-options="'is_hover:" false'=""
Как утверждает Дэн, это работает правильно
@(Model.IsTablet ? "data-options=is_hover:false" : "")
рендеринг в качестве первого примера должен быть.
data-options="is_hover:false"
но если вы добавите пробел в атрибуте, он сломает любые странные вещи, которые делает asp.net 4.0, и думает, что ваш атрибут заканчивается в пространстве.
И это не означает, что html escaping, поскольку действительный синтаксис html не работает, и вся точка бритвы заключается в том, что синтаксис бритвы должен работать с действительным html, а не нарушать его.