442

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

不过,我希望有一种方法可以使用三元运算符,而不会退回到将其包装在扩展方法中。

4

7 回答 7

844

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

<a class="@(User.Identity.IsAuthenticated ? "auth" : "anon")">My link here</a>
于 2010-11-03T22:22:52.693 回答
65

附录:

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

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

@(expression)

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

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

因此,解决方案是:

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

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

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

于 2011-11-16T11:36:15.597 回答
27

更简单的版本,让眼睛更容易!

@(true?"yes":"no")
于 2012-01-22T15:57:49.677 回答
18

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

它也必须在 razor 表达式中:

@(Razor_Expression)

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

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

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

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

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

于 2012-11-07T14:33:46.093 回答
3

在我的问题中,我希望<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")
于 2016-08-17T07:19:06.747 回答
1

您也可以使用此方法:

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

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

于 2016-11-22T07:54:02.460 回答
0

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

<tr class="@(@businesstypes.IsActive ? "" : "strikethrough")">
于 2020-08-28T17:55:32.010 回答