Механизм просмотра 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=&quot;active&quot;>
    <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&#39;=""

Как утверждает Дэн, это работает правильно

@(Model.IsTablet ? "data-options=is_hover:false" : "")

рендеринг в качестве первого примера должен быть.

data-options="is_hover:false"

но если вы добавите пробел в атрибуте, он сломает любые странные вещи, которые делает asp.net 4.0, и думает, что ваш атрибут заканчивается в пространстве.

И это не означает, что html escaping, поскольку действительный синтаксис html не работает, и вся точка бритвы заключается в том, что синтаксис бритвы должен работать с действительным html, а не нарушать его.