如何使用 ? : 带有 Razor 和内联代码块的 if 语句
Posted
技术标签:
【中文标题】如何使用 ? : 带有 Razor 和内联代码块的 if 语句【英文标题】:How to use ? : if statements with Razor and inline code blocks 【发布时间】:2011-06-13 19:48:13 【问题描述】:我正在使用新的 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>
但是这里有两个问题:
vote-up@puzzle.UserVote
.... 不将 @ 符号视为代码块的开头
@puzzle.UserVote == VoteType.Up
看着第一部分 @puzzle.UserVote
好像它应该呈现变量的值。
有人知道如何解决这些问题吗?
【问题讨论】:
我没有使用过 Razor,但根据我所看到的,试试@(puzzle.UserVote == VoteType.Up ? "-selected" : "")
由于这是 razor 中内联三元运算符的最佳结果,我将补充一点,如果您的输出包含 html 或撇号等可编码字符,例如@(isSomething ? "class='test'" : "")
例如注入 javascript 或类似的,它会将它们编码为像 &#39;
这样的实体并打破页面。所以你必须使用Html.Raw("..")
。否则,使用上面的代码,你最终会得到类似 <p class=&#39;test&#39;>
的东西,这是无效的。
【参考方案1】:
在大多数情况下,the solution 或 CD.. 都可以正常工作。但是我的情况有点扭曲:
@(String.IsNullOrEmpty(Model.MaidenName) ? " " : Model.MaidenName)
这会打印我“ ”在我的页面中,分别生成源&amp;nbsp;
。现在有一个函数Html.Raw("&nbsp;")
应该可以让你编写源代码,除了在这个星座中它会引发编译器错误:
编译器错误消息:CS0173:条件表达式类型不能 确定,因为之间没有隐式转换 'System.Web.IHtmlString' 和'字符串'
所以我最终写了一个类似下面的语句,虽然不太好,但即使在我的情况下也有效:
@if (String.IsNullOrEmpty(Model.MaidenName)) @Html.Raw(" ") else @Model.MaidenName
注意:有趣的是,一旦你在花括号内,你必须重新启动一个 Razor 块。
【讨论】:
为什么不只是@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Model.MaidenName)
Uhm.. 由于前面提到的编译器错误,怎么样? ;)
对不起,我需要更多的咖啡 :)
您可以通过将三元运算符的两边设为相同类型来避免该错误,@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Html.Raw(Model.MaidenName))
【参考方案2】:
@( condition ? "true" : "false" )
【讨论】:
我选择了这个,感觉干净,以后很容易阅读 如果您需要显示属性的值(包括字符串)而不是调用 ToString() - 这在我的情况下不起作用。你可以这样做 @(condition ? $"foo.bar" : "Default")【参考方案3】:关键是将表达式封装在@分隔符之后的括号中。您可以使任何复合表达式都以这种方式工作。
【讨论】:
【参考方案4】:这应该可行:
<span class="vote-up@(puzzle.UserVote == VoteType.Up ? "-selected" : "")">Vote Up</span>
【讨论】:
使用括号而不是大括号很奇怪以上是关于如何使用 ? : 带有 Razor 和内联代码块的 if 语句的主要内容,如果未能解决你的问题,请参考以下文章
在 Razor 页面中使用 @functions 块的错误和警告
如何从 Razor 页面返回带有 HTTP 状态代码 500 的 JsonResult?