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;
    ...
}

有人可以解释为什么吗?

谢谢。

Razor CSHTML 中的 switch 语句

这是剃刀的时髦。当您使用普通 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;