【问题标题】:How to use ternary operator in razor (specifically on HTML attributes)?如何在剃刀中使用三元运算符(特别是在 HTML 属性上)?
【发布时间】:2011-05-04 18:12:26
【问题描述】:

对于 WebForms 视图引擎,我通常将三元运算符用于非常简单的条件,尤其是在 HTML 属性中。例如:

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

上面的代码会给&lt;a&gt;标签一个authanon的类,这取决于用户是否被认证。

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>

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

【问题讨论】:

标签: razor asp.net-mvc-3


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

附录:

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

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

@(expression)

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

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

因此,解决方法是:

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

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

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

【讨论】:

  • 在将类似的 cmets 添加到主要答案后,才注意到您的附录。
  • 表达式如何成为泛型方法?
【解决方案3】:

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

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

【讨论】:

  • 这并不简单。这是相同的答案,不同的值
  • -1 Dave Rael 是对的,这是具有不同值的相同代码
  • 这实际上解释了三元运算符。因此,对于没有说明条件中真假在哪里的解决方案,这是一个很好的上瘾。
  • 我是这么认为的。作为开发人员,我们可以有明确的答案.. 有时。
【解决方案4】:

对于那些使用 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 之间的布尔符号不同。

【讨论】:

    【解决方案5】:

    在我的问题中,我希望我视图中的锚点 &lt;a&gt;text&lt;/a&gt; 的文本基于某个值 并且该文本是从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")
    

    【讨论】:

      【解决方案6】:

      你也可以用这个方法:

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

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

      【讨论】:

      • 是否需要在mvc条件下添加@?我不这么认为,因为@已经在一开始就被使用了。
      【解决方案7】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-04-06
        • 1970-01-01
        • 2022-11-17
        • 1970-01-01
        • 2016-04-29
        • 2016-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多