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

时间:2010-11-03 21:24:39

标签: razor asp.net-mvc-3

使用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> }

这是温和的,可怕的

我很乐意做喜欢这个,但我很难理解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>

尽管如此,我希望有一种方法可以使用三元运算符而不会退回到扩展方法中。

7 个答案:

答案 0 :(得分:707)

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

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

我没有安装Razor,所以我错了。

答案 1 :(得分:50)

附录:

重要的概念是您正在评估Razor代码中的表达式。执行此操作的最佳方法(例如,如果您处于foreach循环中)是使用泛型方法。

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

@(expression)

在这种情况下,表达式为:

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

因此,解决方案是:

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

此代码可以在Razor中的任何位置使用,而不仅仅用于html属性。

请参阅@Kyralessa对C#Razor语法快速参考的评论(Phil Haack的博客)。

答案 2 :(得分:18)

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

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

答案 3 :(得分:16)

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

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

@(Razor_Expression)

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

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

这里用VB razor显示的代码示例如下:

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

注意:编写TextExpression时,请记住C#和VB之间的布尔符号不一样。

答案 4 :(得分:0)

在我的问题中,我希望视图中的锚<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")

答案 5 :(得分:0)

您也可以使用此方法:

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

试试这个.. 祝好运 感谢。

答案 6 :(得分:0)

我在表行中有一个名为IsActive的字段,当删除一项后,该字段为True。此代码仅将一个名为删除线的CSS类应用于删除的项目。您可以看到它如何使用C#三元运算符:

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