对于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> }

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

我很想做这样的事情,但我很难理解如何在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>

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


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

<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之间的布尔符号是不一样的。


在我的问题,我想锚的文本< >文本</ >内我的视图是基于一些值 这个文本是从App字符串资源中检索的

这个@()就是解

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

如果文本不是来自App字符串资源使用这个

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

你也可以使用这个方法:

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

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


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

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