Razor CSHTML 中的 switch 语句
本文关键字:语句 switch 中的 CSHTML Razor | 更新日期: 2023-09-27 18:34:19
我正在 ASP.NET MVC4,Twitter.Bootstap 3.0.0和Razor中开发一个项目。在视图中,我需要根据属性值显示按钮。使用 switch
语句,下面的示例不起作用(不显示任何内容(:
@switch (Model.CurrentStage) {
case Enums.Stage.ReadyToStart:
Html.ActionLink(Language.Start, "Start", new { id=Model.ProcessId }, new { @class = "btn btn-success" });
break;
case Enums.Stage.Flour:
Html.ActionLink(Language.GoToFlour, "Details", "Flours", new { id=Model.Flour.FlourId }, new { @class = "btn btn-success" });
break;
...
}
稍微改变一下,使用 <span>
标签,代码就可以工作了:
@switch (Model.CurrentStage) {
case Enums.Stage.ReadyToStart:
<span>@Html.ActionLink(Language.Start, "Start", new { id=Model.ProcessId }, new { @class = "btn btn-success" })</span>
break;
case Enums.Stage.Flour:
<span>@Html.ActionLink(Language.GoToFlour, "Details", "Flours", new { id=Model.Flour.FlourId }, new { @class = "btn btn-success" })</span>
break;
...
}
有人可以解释为什么吗?
谢谢。
这是剃刀的时髦。当您使用普通 HTML 并使用 C# 代码时,在其上放置带有@
符号的内容会将结果写入页面:
<p>@Html.ActionLink("whatever", "whatever"...)</p>
这类似于老派<%= %>
.
<p><%= SomeMethodThatReturnsSomethingThatWillBeWritten() %></p>
但是,Html.ActionLink 方法只是在 .NET 世界中返回一个MvcHtmlString
对象。在第一个示例中,你有一个常规的 C# 代码块。因此,从那里调用Html.ActionLink()
只是执行它并将MvcHtmlString
返回给任何人。在第二个示例中,您已跳回 HTML 上下文,因此它会再次写入 HTML。
你可以使用特殊的<text>
块返回 HTML,而不是使用 <span>
或其他真正的 HTML,它会直接写入而不编写额外的 HTML:
case Enums.Stage.ReadyToStart:
<text>@Html.ActionLink(Language.Start, "Start", new { id=Model.ProcessId }, new { @class = "btn btn-success" })</text>
break;
您还可以使用类似的@:
语法:
case Enums.Stage.ReadyToStart:
@:@Html.ActionLink(Language.Start, "Start", new { id=Model.ProcessId }, new { @class = "btn btn-success" })
break;
您可以在此处阅读有关两者的更多信息
编辑
实际上,在这种情况下,您不需要任何一个。你只需要@
符号,这足以让你回到 HTML 中:
case Enums.Stage.ReadyToStart:
@Html.ActionLink(Language.Start, "Start", new { id=Model.ProcessId }, new { @class = "btn btn-success" })
break;