Ответ 1
Вы должны использовать синтаксис выражения @()
:
<a class="@(User.Identity.IsAuthenticated ? "auth" : "anon")">My link here</a>
У меня нет установленной Razor, поэтому я могу ошибаться.
С механизмом просмотра 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>
-
Update:
Тем временем я создал этот 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>
Тем не менее, я надеюсь, что есть возможность использовать тернарный оператор, не откидываясь назад, чтобы обернуть его в метод расширения.
Вы должны использовать синтаксис выражения @()
:
<a class="@(User.Identity.IsAuthenticated ? "auth" : "anon")">My link here</a>
У меня нет установленной Razor, поэтому я могу ошибаться.
Важная концепция заключается в том, что вы оцениваете выражение в своем коде Razor. Лучший способ сделать это (если, например, вы находитесь в цикле foreach) использует общий метод.
Синтаксис вызова общего метода в Razor:
@(expression)
В этом случае выражение:
User.Identity.IsAuthenticated ? "auth" : "anon"
Следовательно, решение:
@(User.Identity.IsAuthenticated ? "auth" : "anon")
Этот код можно использовать в любом месте Razor, а не только для атрибута html.
См. комментарий @Kyralessa для краткой справки синтаксиса С# Razor (блог Phil Haack).
Простая версия, для легких глаз!
@(true?"yes":"no")
Для тех из вас, кто использует ASP.net с бритвой VB, возможен и тройной оператор.
Он также должен быть внутри выражения бритвы:
@(Razor_Expression)
а тернарный оператор работает следующим образом:
If(BooleanTestExpression, "TruePart", "FalsePart")
Тот же пример кода, показанный здесь с бритвой VB, выглядит следующим образом:
<a class="@(If(User.Identity.IsAuthenticated, "auth", "anon"))">My link here</a>
Примечание: при написании TextExpression помните, что логические символы не совпадают между С# и VB.
в моей проблеме я хочу, чтобы текст привязки <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")
Вы также можете использовать этот метод:
<input type="text" class="@(@mvccondition ? "true-class" : "false-class")">
Попробуйте это. Удачи Спасибо.