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

Por*_*man 387 razor asp.net-mvc-3

使用WebForms视图引擎,我通常会使用三元运算符来处理非常简单的条件,特别是在HTML属性中.例如:

<a class="<%=User.Identity.IsAuthenticated ? "auth" : "anon" %>">My link here</a>
Run Code Online (Sandbox Code Playgroud)

上面的代码将为<a>标记提供一个类authanon取决于用户是否经过身份验证.

Razor视图引擎的等效语法是什么?因为Razor需要HTML标签来"知道"何时跳入和跳出代码和标记,所以我现在仍然坚持以下内容:

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

温和地说,这很可怕.

我很想做一些喜欢这一点,但我在努力了解如何在剃刀:

<a class="@=User.Identity.IsAuthenticated ? "auth" : "anon";">My link here</a>
Run Code Online (Sandbox Code Playgroud)

-

更新:

与此同时,我创建了这个HtmlHelper:

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

这可以从Razor这样调用:

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

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

Dav*_*own 736

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

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

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

  • 这是Razor语法的一个方便参考:[C#Razor语法快速参考](http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx) (57认同)

awr*_*ley 53

附录:

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

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

@(expression)
Run Code Online (Sandbox Code Playgroud)

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

User.Identity.IsAuthenticated ? "auth" : "anon"
Run Code Online (Sandbox Code Playgroud)

因此,解决方案是:

@(User.Identity.IsAuthenticated ? "auth" : "anon")
Run Code Online (Sandbox Code Playgroud)

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

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


Mon*_*s X 20

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

@(true?"yes":"no")
Run Code Online (Sandbox Code Playgroud)

  • 这并不简单.这是不同价值观的答案 (11认同)
  • 这实际上解释了三元运算符.所以这对解决方案来说是一个很好的上瘾,但没有说明条件中的真假. (6认同)
  • -1 Dave Rael是对的,这是具有不同值的相同代码 (4认同)
  • 我是这么想的.作为开发者,我们有时会得到明确的答案. (3认同)

小智 17

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

它也必须在一个剃刀表达式内:

@(Razor_Expression)
Run Code Online (Sandbox Code Playgroud)

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

If(BooleanTestExpression, "TruePart", "FalsePart")
Run Code Online (Sandbox Code Playgroud)

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

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

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


Bas*_*ANI 6

在我的问题中,我希望视图中的锚点文本<a>text</a>基于某个值,并且该文本是检索形式App string Resources

所以,这@()就是解决方案

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

如果文本不是来自App string Resources使用这个

@(Model.ID == 0 ? "Back" :"Descart Changes")
Run Code Online (Sandbox Code Playgroud)