如何使用 ? : 带有 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 或类似的,它会将它们编码为像 &amp;#39; 这样的实体并打破页面。所以你必须使用Html.Raw("..")。否则,使用上面的代码,你最终会得到类似 &lt;p class=&amp;#39;test&amp;#39;&gt; 的东西,这是无效的。 【参考方案1】:

在大多数情况下,the solution 或 CD.. 都可以正常工作。但是我的情况有点扭曲:

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

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

编译器错误消息:CS0173:条件表达式类型不能 确定,因为之间没有隐式转换 'System.Web.IHtmlString' 和'字符串'

所以我最终写了一个类似下面的语句,虽然不太好,但即使在我的情况下也有效:

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

注意:有趣的是,一旦你在花括号内,你必须重新启动一个 Razor 块。

【讨论】:

为什么不只是@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&amp;nbsp;") : Model.MaidenName) Uhm.. 由于前面提到的编译器错误,怎么样? ;) 对不起,我需要更多的咖啡 :) 您可以通过将三元运算符的两边设为相同类型来避免该错误,@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&amp;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?

使用内联方式展示Razor视图

ASP.NET Razor——ASP.NET Razor - C#代码语法

ApiControllers 和 Razor 视图

APS.NET MVC + EF (04)---路由和数据传递