如何使用 ?:带有Razor和内联代码块的if语句


154

我正在使用新的Razore视图引擎更新旧的.aspx视图。我在很多地方都有这样的代码:

<span class="vote-up<%= puzzle.UserVote == VoteType.Up ? "-selected" : "" %>">Vote Up</span>

理想情况下,我想这样做:

<span class="vote-up@{puzzle.UserVote == VoteType.Up ? "-selected" : ""}">Vote Up</span>

但是,这里有两个问题:

  1. vote-up@{puzzle.UserVote ....不会将@符号视为代码块的开头
  2. @puzzle.UserVote == VoteType.Up看起来@puzzle.UserVote就像应该渲染变量的值一样。

有人知道如何解决这些问题吗?


6
我没有使用过Razor,但根据我所看到的,尝试@(puzzle.UserVote == VoteType.Up ? "-selected" : "")
Lasse Espeholt 2011年

由于这是razor中的内联三元运算符的最高结果,因此我要补充一点,如果您的输出包含html或可编码字符(例如撇号),@(isSomething ? "class='test'" : "")例如注入javascript或类似字符,它将把它们编码为诸如like的实体,&#39;并破坏页面。因此,您必须使用Html.Raw("..")。否则,使用上面的代码,您将得到类似<p class=&#39;test&#39;>无效的东西。
NibblyPig

Answers:


298

这应该工作:

<span class="vote-up@(puzzle.UserVote == VoteType.Up ? "-selected" : "")">Vote Up</span>

2
很奇怪的使用括号而不是护具
拍拍capozzi

32

关键是将表达式用@分隔符括在括号中。您可以使任何复合表达式以此方式工作。


28
@( condition ? "true" : "false" )

1
我去过这里,感觉很干净,以后很容易阅读
Dan Harris

1
如果您需要显示属性(包括字符串)的值而不是调用ToString()-在我的情况下不起作用。您可以使用@(condition?$“ {foo.bar}”:“ Default”)
Dan Harris

6

在大多数情况下,CD .. 的解决方案可以正常工作。但是我有一个更加扭曲的情况:

 @(String.IsNullOrEmpty(Model.MaidenName) ? "&nbsp;" : Model.MaidenName)

这会向我显示“&nbsp;” 在我的页面中,分别生成source &amp;nbsp;。现在有一个Html.Raw("&nbsp;")应该让您编写源代码的函数,除了在这个星座中它会引发编译器错误:

编译器错误消息:CS0173:无法确定条件表达式的类型,因为在'System.Web.IHtmlString'和'string'之间没有隐式转换

因此,我最终编写了如下语句,虽然效果不太好,但即使在我的情况下也可以使用:

@if (String.IsNullOrEmpty(Model.MaidenName)) { @Html.Raw("&nbsp;") } else { @Model.MaidenName } 

注意:有趣的是,一旦进入花括号,就必须重新启动Razor块。


为什么不干脆@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Model.MaidenName)
JP Hellemons

嗯..由于前面提到的编译器错误怎么办?;)
Damian Vogel,

3
抱歉,我需要更多咖啡:)
JP赫勒蒙斯

1
您可以通过使三元运算符的两端都具有相同的类型来避免该错误,@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Html.Raw(Model.MaidenName))
-NibblyPig
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.