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

有人可以解释为什么吗?

谢谢。

4

1 回答 1

27

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

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

这与老派类似<%= %>

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

但是,Html.ActionLink 方法只是返回MvcHtmlString.NET 世界中的一个对象。在您的第一个示例中,您有一个常规的 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;

您可以在此处阅读有关两者的更多信息

编辑

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

case Enums.Stage.ReadyToStart:
    @Html.ActionLink(Language.Start, "Start", new { id=Model.ProcessId }, new { @class = "btn btn-success" })
    break;
于 2013-10-06T20:08:39.160 回答