我正在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;
...
}
有人可以解释原因吗?
感谢。
答案 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;