在Razor CSHTML中切换语句

时间:2013-10-06 20:02:36

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor

我正在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;
    ...
}

有人可以解释原因吗?

感谢。

1 个答案:

答案 0 :(得分:20)

这是Razor的乐趣。当您使用普通HTML并使用C#代码时,在其上放置带有@符号的内容会将结果写入页面:

<p>@Html.ActionLink("whatever", "whatever"...)</p>

这与老派<%= %>类似。

<p><%= SomeMethodThatReturnsSomethingThatWillBeWritten() %></p>

但是,Html.ActionLink方法只返回.NET世界中的MvcHtmlString对象。在您的第一个示例中,您有一个常规的C#代码块。因此,从那里调用Html.ActionLink()只需执行它并将MvcHtmlString返回给nobody。在第二个示例中,您已经跳回到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;

您可以阅读有关here

的更多信息

修改

实际上,在这种情况下,您不需要任何一个。您只需要@符号,这足以让您重新回到HTML:

case Enums.Stage.ReadyToStart:
    @Html.ActionLink(Language.Start, "Start", new { id=Model.ProcessId }, new { @class = "btn btn-success" })
    break;