首页 文章

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

提问于
浏览
363

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

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

上面的代码将为 <a> 标记提供一个 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>

Update:

与此同时,我创建了这个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>

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

6 回答

  • 50

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

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

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

  • 0

    附录:

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

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

    @(expression)
    

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

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

    因此,解决方案是:

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

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

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

  • 691

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

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

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

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

    @(Razor_Expression)
    

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

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

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

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

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

  • 0

    在我的问题中,我希望我的视图中的锚 <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")
    
  • 16

    您也可以使用此方法:

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

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

相关问题