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


401

借助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> }

坦率地说,这是可怕的

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

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

不过,我希望有一种使用三元运算符的方法,而不必退一步将其包装在扩展方法中。


就“最佳实践”而言,我认为您应该使用辅助IHtmlString方法new HtmlString("Some stuff here");等返回类型……
Justin Soliz 2011年



Answers:


767

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

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

不过,我没有安装Razor,所以我可能是错的。


60
这是对Razor语法的方便参考:C#Razor语法快速参考
Ryan Lundy

<a class=@(User.Identity.IsAuthenticated?"auth":"anon")>此处的链接</a>
BiLaL

我可以在此逻辑中添加&&运算符吗?
alerya

58

附录:

重要的概念是您正在评估Razor代码中的表达式。最好的方法(例如,如果您处于foreach循环中)是使用通用方法。

在Razor中调用通用方法的语法为:

@(expression)

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

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

因此,解决方案是:

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

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

有关C#Razor语法快速参考,请参见@Kyralessa的注释(Phil Haack的博客)。


在向主要答案中添加了类似的注释后,才注意到您的附录。
BiLaL 2015年

22

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

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

11
这并不简单。这是具有不同值的相同答案
Dave Rael 2012年

4
-1 Dave Rael是正确的,这是具有不同值的相同代码
Jacques

6
这实际上解释了三元运算符。因此,这是对解决方案的一种沉迷,它没有说明条件中对与错的位置。
Maurizio在丹麦,2013年

3
我是这么想的。作为开发人员,我们被允许有明确的答案..有时。
Monsters X

17

对于将ASP.net与VB剃刀一起使用的人,也可以使用三元运算符。

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

@(Razor_Expression)

三元运算符的工作方式如下:

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

此处显示的使用VB剃须刀的相同代码示例如下所示:

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

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


1

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

0

您也可以使用以下方法:

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

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


有没有必要在mvc条件下添加@?我不这么认为,因为@已经在开始使用。
Mubashar Shahzad

无需在@()下使用@
Aikansh Mann 19/12/18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.