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

Posted

技术标签:

【中文标题】如何在剃刀中使用三元运算符(特别是在 HTML 属性上)?【英文标题】:How to use ternary operator in razor (specifically on HTML attributes)? 【发布时间】: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>

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

【问题讨论】:

就“最佳实践”而言,我相信您应该使用 new HtmlString("Some stuff here"); 方法返回类型 IHtmlString 以获取帮助等... 你喜欢***.com/questions/6981853/… 请投票here。 相关:***.com/questions/7729024/asp-net-mvc-razor-ternary 【参考方案1】:

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

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

【讨论】:

这里是 Razor 语法的方便参考:C# Razor Syntax Quick Reference 我的链接在这里 我可以在这个逻辑中添加 && 运算符吗? 也可以:链接【参考方案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")">

【讨论】:

以上是关于如何在剃刀中使用三元运算符(特别是在 HTML 属性上)?的主要内容,如果未能解决你的问题,请参考以下文章

如何将剃刀页面包含在另一个剃刀页面中?

你如何在Python中将十六进制转换为三元组?

javascript:如何在 html 中使用三元表达式渲染?

为@Html.Partial() 混合剃刀和javascript代码

三元运算符 与 return

如何使用三元运算符将类添加到 ejs 中的 HTML 元素