Razor View Engine автоматически применяя кавычки? - PullRequest
26 голосов
/ 11 февраля 2012

Я уже привык к бритве, но не могу понять, почему следующий синтаксис правильный?

<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>

Каким-то образом это волшебным образом сортирует цитаты, но я не могу найти никаких ссылок в статьях о бритве, чтобы предположить, что это ожидается, поэтому мне интересно, не полагается ли это на неправильное поведение. Если я добавлю одинарные или двойные кавычки в строку вокруг слова «активный», как и следовало ожидать при запуске html, я получу:

<li class="'active'">
    <a href="/">Home</a>
</li>

или

<li class=&quot;active&quot;>
    <a href="/">Home</a>
</li>

Почему это работает так, и мой код правильный (в отличие от простого функционирования)?

Ответы [ 3 ]

15 голосов
/ 27 марта 2013

Просто натолкнитесь на это, так что мысль ответила бы - SLaks выглядит правильно с Html.Raw, но OP также верен в том, что второй метод не выглядит работающим - кодируется s.

Мое решение было:

<li@(active ? Html.Raw(" class=\"active\"") : null)>
15 голосов
/ 11 февраля 2012

Razor автоматически HTML-экранирует весь вывод кода.
Вы можете предотвратить это, написав @Html.Raw(...)

Кроме того, вы можете поместить кавычки в буквальный текст:

<li class="@(active ? "active" : "")>

Ваш пример работает, потому что у вас фактически нет кавычек.
Сгенерированный источник HTML читает <li class=active>.

3 голосов
/ 15 января 2014

Только что столкнулся с этим странным поведением.Логически должно работать следующее:

@(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, поскольку действительный синтаксис html не работает, и весь смысл бритвы в том, что синтаксис бритвы должен работать с действительным html, а не нарушать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...