如何使用三元运算符剃刀(特别是HTML属性)?

对于WebForms视图引擎,我通常将三元操作符用于非常简单的条件,特别是在HTML属性中。例如:

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

上面的代码将根据用户是否经过身份验证,为<a>标记赋予authanon的类。

Razor视图引擎的等效语法是什么?因为Razor要求HTML标签“知道”何时插入和跳出代码和标记,我目前被以下问题困住了:

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

这是,说得委婉点,可怕的

我想做一些就像这,但我很难理解如何在剃刀:

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

尽管如此,我还是希望有一种方法可以使用三元操作符,而不用回到扩展方法中。

220384 次浏览

你应该能够使用@()表达式语法:

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

附录:

重要的概念是,您正在对Razor代码中的表达式求值。做到这一点的最佳方法(例如,如果您处于foreach循环中)是使用泛型方法。

在Razor中调用泛型方法的语法是:

@(expression)

在本例中,表达式为:

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

因此,解决方案是:

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

这段代码可以在Razor中的任何地方使用,而不仅仅是用于html属性。

c# Razor语法快速参考(Phil Haack的博客)参见@Kyralessa的评论。

一个更简单的版本,轻松的眼睛!

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

对于那些使用ASP.net和VB razor的人来说,三元运算符也是可能的。

它也必须在剃刀表达式中:

@(Razor_Expression)

而三元运算符的工作原理如下:

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

使用VB razor的相同代码示例如下所示:

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

注意:在编写TextExpression时,要记住c#和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")">

试试这个… 祝你好运 谢谢。< / p >

我在表行中有一个名为IsActive的字段,当一个项目被删除时,该字段为True。这段代码只对已删除的项应用名为strike - through的CSS类。你可以看到它是如何使用c#三元运算符的:

<tr class="@(@businesstypes.IsActive ? "" : "strikethrough")">