Как использовать троичный оператор в бритве (в частности, на атрибутах HTML)?

402

С движком представления 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");для помощников и т. Д.
Джастин Солиз,
Вы делаете как stackoverflow.com/questions/6981853/…
Элан Хассон
Пожалуйста, проголосуйте здесь .
Шимми Вайцхандлер
Связанный: stackoverflow.com/questions/7729024/asp-net-mvc-razor-ternary
Натан Хартли

Ответы:

768

Вы должны быть в состоянии использовать @()синтаксис выражения:

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

У меня не установлена ​​Razor, поэтому я могу ошибаться.

Дэвид Браун
источник
60
Вот полезная ссылка на синтаксис Razor: Краткий
Райан Ланди,
<a class=@(User.Identity.IsAuthenticated? "auth": "anon")> Моя ссылка здесь </a>
BiLaL
Могу ли я добавить && оператор в эту логику?
Alerya
58

Приложение:

Важной концепцией является то, что вы оцениваете выражение в своем коде Razor. Лучший способ сделать это (например, если вы находитесь в цикле foreach) - использовать универсальный метод.

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

@(expression)

В этом случае выражение:

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

Следовательно, решение состоит в следующем:

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

Этот код можно использовать где угодно в Razor, а не только для атрибута html.

См. Комментарий @Kyralessa к краткому справочнику по синтаксису C # Razor (блог Фила Хаака).

awrigley
источник
только что заметил ваше приложение после добавления похожих комментариев к основному ответу.
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.

George_DLJ
источник
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? Я так не думаю, потому что @ уже использовался в начале.
Мубашар Шахзад
нет необходимости использовать @ под @ ()
Айканш Манн