Условный атрибут Razor не работает

В теге я хочу условно вывести атрибут стиля, например: <li style="@styleVar" >...</li> Когда styleVar равен нулю, он не должен быть записан razor (просто предполагаемая стандартная функциональность в Razor 2), но по какой-то странной причине он выводится как <li style="">...</li>, а я ожидать <li>...</li>.

Это в частичном виде. В обычном режиме работает. Так это ошибка в частичных просмотрах?

У кого-нибудь такой же опыт?


person Jaap    schedule 07.11.2012    source источник
comment
Предполагая, что вы используете здесь MVC3, если вы можете перейти на MVC4, то вы получите это поведение бесплатно: beletsky.net/2012/04/new-in-aspnet-mvc4-razor-changes.html   -  person Mike Simmons    schedule 07.11.2012
comment
Я использую MVC4. Обратите внимание, я сказал, что использую Razor 2, который включен в MVC4.   -  person Jaap    schedule 07.11.2012
comment
Кажется, что бритва немного придирчива к пробелам здесь, я удалил пробел между именем атрибута и «=», и это сработало.   -  person Fionn    schedule 26.01.2013


Ответы (6)


Похоже, это не работает в частичных представлениях и для пользовательских атрибутов html, таких как data-test="@test". Это не пропущено, вместо этого он по-прежнему ставит data-test="". Поэтому команда MVC должна исправить это как можно скорее.

person lymber    schedule 25.07.2013
comment
я почти уверен, что это преднамеренно, если атрибуты data не удалены - person Simon_Weaver; 13.05.2014
comment
data- не может использовать условный атрибут, вы можете найти эту ссылку в исходном коде // Сначала определите, является ли это атрибутом 'data-' (поскольку они не могут использовать условные атрибуты) LocationTagged‹string› name = nameSymbols. ПолучитьСодержимое(Промежуток.Начало); bool attributeCanBeConditional = !name.Value.StartsWith(data-, StringComparison.OrdinalIgnoreCase); - person Vincent; 28.05.2014

Если styleVar равно null (а не string.Empty), mvc4 автоматически сделает это.

Отображение условного атрибута

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

<div @{if (myClass != null) { <text>class="@myClass"</text> } }>Content</div>

Теперь Razor может обрабатывать это автоматически, поэтому вы можете просто записать атрибут. Если он равен нулю, атрибут не записывается:

<div class="@myClass">Content</div>

Итак, если @myClass имеет значение null, вывод будет таким:

<div>Content</div>
person Chamika Sandamal    schedule 19.01.2013
comment
Это применимо и к Html.Helpers? - person Meryovi; 20.05.2013
comment
если значение атрибута равно null, атрибут не будет отображаться - person Chamika Sandamal; 20.05.2013

Не видите ошибок в своем коде: вы делаете разметку "жесткого кода" и меняете только значение стиля. Чтобы добиться того, что вы пытаетесь сделать, вам нужен код, подобный этому:

@if(!string.IsNullOrEmpty(styleVar))
{
  <li style="@styleVar" >...</li>
}
person Dima    schedule 07.11.2012
comment
Я ожидаю ‹li›...‹/li› в качестве вывода. Отредактировал мой вопрос, чтобы уточнить это. - person Jaap; 07.11.2012
comment
Согласно вашим изменениям. Если строка оценивается как NULL, она удалит пустой атрибут, но если строка оценивается как пустая строка, она отобразит пустой атрибут. Это алгоритм Razor v2 - person Dima; 07.11.2012
comment
действительно, это работает для представлений верхнего уровня, но, похоже, не работает для частичных представлений. - person Jaap; 07.11.2012

Другая возможная причина — комментарий Razor в теге HTML.

// This renders <div>Hello world</div>
<div class="@null">Hello world</div>

// Renders <div  class="">Hello world</div>
<div @**@ class="@null">Hello world</div>

Я столкнулся с этим, когда закомментировал один атрибут для целей тестирования, и внезапно мои условные атрибуты были нарушены.

person Niels van der Rest    schedule 06.03.2014

У меня только что была ситуация, когда пробел между именем атрибута и знаком равенства нарушал логическую условную визуализацию:

So

<input type="checkbox" name="fieldname" id ="fieldname" checked="@Model.MyBool" />

отображается с помощью checked="True", тогда как

<input type="checkbox" name="fieldname" id="fieldname" checked="@Model.MyBool" />

отображается правильно с checked="checked"

Условный рендеринг выглядит довольно хрупким.

Это не совсем ответ на детали вопроса ОП, но это определенно возможность для людей, которые ищут помощь с «условным атрибутом Razor не работает»

person Will Dean    schedule 08.11.2017

Когда styleVar == null вы получите <li style="">... (по крайней мере, с mvc3) в частичном и обычном представлениях.

Я думаю, вам нужно использовать условный оператор:

<li @(styleVar == null ? "" : "style=\"" + styleVar + "\"")>...</li>
person Jan    schedule 07.11.2012
comment
Я работаю с Razor 2, как я сказал в своем вопросе, который используется в MVC4. Так что этот ответ не подходит - person Jaap; 07.11.2012