Asp.net 如何使用带有Razor和内联代码块的if语句
我正在用新的Razore视图引擎更新旧的.aspx视图。我有很多地方有这样的代码:Asp.net 如何使用带有Razor和内联代码块的if语句,asp.net,asp.net-mvc,asp.net-mvc-3,syntax,razor,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Syntax,Razor,我正在用新的Razore视图引擎更新旧的.aspx视图。我有很多地方有这样的代码: <span class="vote-up<%= puzzle.UserVote == VoteType.Up ? "-selected" : "" %>">Vote Up</span> 投赞成票 理想情况下,我想这样做: <span class="vote-up@{puzzle.UserVote == VoteType.Up ? "-selected" : ""}"&
<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
,就好像它应该呈现变量的值一样<span class="vote-up@(puzzle.UserVote == VoteType.Up ? "-selected" : "")">Vote Up</span>
投赞成票
关键是将表达式封装在@delimiter后面的括号中。您可以通过这种方式使任何复合表达式工作。在大多数情况下都可以工作得很好。但是我遇到了一个更扭曲的情况:
@( condition ? "true" : "false" )
@(String.IsNullOrEmpty(Model.MaidenName) ? " " : Model.MaidenName)
这将在我的页面中打印“我”,分别生成源代码
。现在有一个函数Html.Raw(“”
),它应该允许您编写源代码,但在这个星座中,它会引发编译器错误:
编译器错误消息:CS0173:无法指定条件表达式的类型
无法确定,因为之间没有隐式转换
'System.Web.IHtmlString'和'string'
因此,我最终写了一个如下的声明,虽然不太好,但在我的情况下仍然有效:
@if (String.IsNullOrEmpty(Model.MaidenName)) { @Html.Raw(" ") } else { @Model.MaidenName }
注意:有趣的是,一旦你进入花括号,你必须重新启动剃须刀块。我没有使用剃须刀,但根据我看到的情况,尝试
@(puzzle.UserVote==VoteType.Up?”-选中“:”)
由于这是razor中内联三元运算符的最高结果,我将补充一点,如果您的输出包含html或可编码字符,如撇号,例如@(isSomething?class='test':)
例如,注入javascript或类似代码,它会将它们编码为实体,如';
并断开页面。因此必须使用Html.Raw(“…”)
。否则,使用上面的代码,您最终会得到类似于
的东西,这是无效的。使用paren而不是大括号非常奇怪。如果您需要显示属性的值(包括字符串)而不是调用ToString()的话,我选择了这一个,感觉很干净,而且以后很容易读懂-这在我的情况下不起作用。您可以这样做@(条件?$“{foo.bar}”:“默认”)为什么不干脆@(String.IsNullOrEmpty(Model.MaidenName)?Html.Raw(“”:Model.MaidenName)
Uhm..由于前面提到的编译器错误,怎么样?;)对不起,我需要更多的咖啡:)您可以通过使三元运算符的两边都是相同的类型来避免这个错误,@(String.IsNullOrEmpty(Model.MaidenName)?Html.Raw(“”:Html.Raw(Model.MaidenName))