如何在剃刀(特别是HTML属性)中使用三元运算符?
使用WebForms视图引擎,我将通常使用三元运算符来创build非常简单的条件,特别是在HTML属性中。 例如:
<a class="<%=User.Identity.IsAuthenticated ? "auth" : "anon" %>">My link here</a>
上面的代码将给<a>
标签一个auth
或anon
的类,这取决于用户是否被authentication。
Razor视图引擎的等效语法是什么? 由于Razor需要HTML标签来“知道”什么时候跳入代码和标记,我目前坚持以下几点:
@if(User.Identity.IsAuthenticated) { <a class="auth">My link here</a> } else { <a class="anon">My link here</a> }
这是说,温和地, 可怕的 。
我会喜欢做这样的事情,但我正在努力去理解剃刀上的情况:
<a class="@=User.Identity.IsAuthenticated ? "auth" : "anon";">My link here</a>
–
更新:
与此同时,我创build了这个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>
不过,我希望有一种方法来使用三元运算符,而不会退步到包装扩展方法。
您应该能够使用@()
expression式语法:
<a class="@(User.Identity.IsAuthenticated ? "auth" : "anon")">My link here</a>
虽然我没有安装razor,所以我可能是错的。
附录:
重要的概念是您正在评估Razor代码中的expression式。 这样做的最好方法(例如,如果你在一个foreach循环)是使用一个通用的方法。
在Razor中调用generics方法的语法是:
@(expression)
在这种情况下,expression式是:
User.Identity.IsAuthenticated ? "auth" : "anon"
所以解决的办法是:
@(User.Identity.IsAuthenticated ? "auth" : "anon")
这个代码可以在Razor的任何地方使用,而不仅仅是一个html属性。
请参阅@Kyralessa对C#Razor语法快速参考(Phil Haack的博客)的评论。
一个简单的版本,容易眼睛!
@(true?"yes":"no")
对于那些谁使用VB.netrazor的三维运营商也是可能的。
它也必须是一个剃刀的expression:
@(Razor_Expression)
三元运算符的工作原理如下:
If(BooleanTestExpression, "TruePart", "FalsePart")
在这里用VB剃刀显示相同的代码示例如下所示:
<a class="@(If(User.Identity.IsAuthenticated, "auth", "anon"))">My link here</a>
注意:当写一个TextExpression时,记住C#和VB之间的布尔符号是不一样的。
在我的问题,我想我的视图内锚锚<a>text</a>
是基于一些价值和文本检索formsApp string Resources
所以,这个@()
是解决scheme
<a href='#'> @(Model.ID == 0 ? Resource_en.Back : Resource_en.Department_View_DescartChanges) </a>
如果文本不是从App string Resources
使用这个
@(Model.ID == 0 ? "Back" :"Descart Changes")
你也可以使用这个方法:
<input type="text" class="@(@mvccondition ? "true-class" : "false-class")">
试试这个..祝你好运谢谢。