关于asp.net mvc 3:如何在剃刀中使用三元运算符(特别是在HTML属性上)?

How to use ternary operator in razor (specifically on HTML attributes)?

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

1
">My link here

上面的代码将为标记提供一个authanon类,具体取决于用户是否经过身份验证。

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

1
2
@if(User.Identity.IsAuthenticated)  { My link here }
else { My link here }

温和地说,这很可怕。

我很想做这样的事情,但我很难理解Razor:

1
My link here

-

更新:

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

1
2
3
4
public static MvcHtmlString Conditional(this HtmlHelper html, Boolean condition, String ifTrue, String ifFalse)
{
  return MvcHtmlString.Create(condition ? ifTrue : ifFalse);
}

这可以从Razor这样调用:

1
My link here

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


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

1
My link here

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


附录:

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

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

1
@(expression)

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

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

因此,解决方案是:

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

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

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


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

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


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

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

1
@(Razor_Expression)

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

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

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

1
My link here

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


您也可以使用此方法:

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

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


在我的问题中,我希望视图中的锚text的文本基于某个值
并且从App string Resources检索该文本

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

1
      @(Model.ID == 0 ? Resource_en.Back : Resource_en.Department_View_DescartChanges)

如果文本不是来自App string Resources,请使用此方法

1
@(Model.ID == 0 ?"Back" :"Descart Changes")