如何在剃刀中使用三元运算符(特别是在 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>
上面的代码会给<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>
不过,我希望有一种方法可以使用三元运算符,而不会退回到将其包装在扩展方法中。
【问题讨论】:
就“最佳实践”而言,我相信您应该使用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】:在我的问题中,我希望我视图中的锚点 <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")
【讨论】:
【参考方案6】:你也可以用这个方法:
<input type="text" class="@(@mvccondition ? "true-class" : "false-class")">
试试这个.. 祝你好运 谢谢。
【讨论】:
是否需要在mvc条件下添加@?我不这么认为,因为@已经在一开始就被使用了。【参考方案7】:我在表行中有一个名为 IsActive 的字段,当项目被删除时该字段为 True。此代码仅将名为删除线的 CSS 类应用于已删除的项目。你可以看到它是如何使用 C# 三元运算符的:
<tr class="@(@businesstypes.IsActive ? "" : "strikethrough")">
【讨论】:
以上是关于如何在剃刀中使用三元运算符(特别是在 HTML 属性上)?的主要内容,如果未能解决你的问题,请参考以下文章
javascript:如何在 html 中使用三元表达式渲染?