Як використовувати потрійний оператор у бритві (зокрема, на атрибути HTML)?


401

За допомогою механізму перегляду WebForms я зазвичай використовую потрійний оператор для дуже простих умов, особливо в межах атрибутів HTML. Наприклад:

<a class="<%=User.Identity.IsAuthenticated ? "auth" : "anon" %>">My link here</a>

Вищевказаний код дасть <a>тегу клас authабо anonзалежно від того, автентифіковано користувача.

Який еквівалентний синтаксис із механізмом подання Razor? Оскільки Razor вимагає тегів HTML, щоб "знати", коли ввійти та вийти з коду та розмітки, я наразі зациклювався на наступному:

@if(User.Identity.IsAuthenticated)  { <a class="auth">My link here</a> }
else { <a class="anon">My link here</a> }

Це, м’яко кажучи, жахливо .

Я хотів би зробити щось подібне , але я намагаюся зрозуміти, як у Razor:

<a class="@=User.Identity.IsAuthenticated ? "auth" : "anon";">My link here</a>

-

Оновлення:

Тим часом я створив цей HtmlHelper:

public static MvcHtmlString Conditional(this HtmlHelper html, Boolean condition, String ifTrue, String ifFalse)
{
  return MvcHtmlString.Create(condition ? ifTrue : ifFalse);
}

який можна назвати так від Razor:

<a class="@Html.Conditional(User.Identity.IsAuthenticated, "auth", "anon")">My link here</a>

Але я сподіваюся, що існує спосіб використовувати потрійний оператор без відкидання, щоб обернути його методом розширення.


Що стосується "Кращих практик", я вважаю, що вам слід повернути тип IHtmlStringіз методом new HtmlString("Some stuff here");для помічників тощо ...
Джастін Соліз


Будь ласка, голосуйте тут .
Шиммі Вайцхандлер

Відповіді:


767

Ви повинні мати можливість використовувати @()синтаксис виразів:

<a class="@(User.Identity.IsAuthenticated ? "auth" : "anon")">My link here</a>

Однак у мене не встановлено бритву, тому я можу помилитися.


60
Ось зручна посилання на синтаксис Razor: C # Короткий довідник синтаксису Razor
Ryan Lundy

<a class=@(User.Identity.IsAuthentication? "auth": "anon")> Моє посилання тут </a>
BiLaL

Чи можу я додати оператора && в цю логіку?
алерія

58

Додаток:

Важлива концепція полягає в тому, що ви оцінюєте вираз у коді Razor. Найкращий спосіб зробити це (якщо, наприклад, ви знаходитесь у циклі foreach) - використовувати загальний метод.

Синтаксис виклику загального методу в Razor:

@(expression)

У цьому випадку виразом є:

User.Identity.IsAuthenticated ? "auth" : "anon"

Тому рішення таке:

@(User.Identity.IsAuthenticated ? "auth" : "anon")

Цей код можна використовувати в будь-якому місці в Razor, а не лише для атрибута html.

Дивіться коментар @Kyralessa для швидкого посилання на синтаксис C # Razor (блог Phil Haack).


щойно помітив ваше доповнення, додавши аналогічні коментарі до основної відповіді.
BiLaL

22

Простіший варіант, для легких очей!

@(true?"yes":"no")

11
це не простіше. це та сама відповідь з різними значеннями
Дейв Реел

4
-1 Дейв Реель правий, це той самий код з різними значеннями
Жак

6
Це фактично пояснює потрійний оператор. Тож це гарна залежність до рішення, яке не говорить про те, де справжня та неправдива ситуація.
Мауріціо У Данії

3
Я так думав. як розробники нам дозволяють мати чіткі відповіді .. інколи.
Монстри X

17

Для тих із вас, хто використовує ASP.net з VB-бритвою, можливий також потрійний оператор.

Він також повинен бути всередині виразки бритви:

@(Razor_Expression)

і потрійний оператор працює наступним чином:

If(BooleanTestExpression, "TruePart", "FalsePart")

Цей самий приклад коду, показаний тут із бритвою VB, виглядає приблизно так:

<a class="@(If(User.Identity.IsAuthenticated, "auth", "anon"))">My link here</a>

Примітка. Коли ви пишете TextExpression, пам’ятайте, що булеві символи не однакові між C # та VB.


1

у своїй проблемі я хочу, щоб текст якоря <a>text</a>всередині мого перегляду базувався на деякому значенні, і щоб текст був отриманий у форміApp string Resources

Отже, це @()рішення

<a href='#'>
      @(Model.ID == 0 ? Resource_en.Back : Resource_en.Department_View_DescartChanges)
</a>

якщо текст не App string Resourcesвикористовується, це не використовується

@(Model.ID == 0 ? "Back" :"Descart Changes")

0

Ви також можете використовувати цей метод:

<input type="text" class="@(@mvccondition ? "true-class" : "false-class")">

Спробуйте це .. Удачі. Спасибі


чи є потреба в додаванні @ з умовою mvc? Я не вважаю так, тому що @ вже використовувався на старті.
Мубашар Шахзад

не потрібно використовувати @ під @ ()
Aikansh Mann
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.