2013-10-06 50 views
13

我正在开发ASP.NET MVC4,Twitter.Bootstap 3.0.0和Razor中的项目。在视图中,我需要显示取决于属性值的按钮。使用switch语句,下面的例子不工作(不显示任何内容):Razor中的Switch语句CSHTML

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

有人能解释一下为什么?

谢谢。

回答

18

这是剃刀的轻松感。当你在普通的HTML和使用C#代码,东西放在上面有一个@符号将结果写入到页面:

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

这类似于老派<%= %>

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

但是,Html.ActionLink方法仅返回.NET世界中的MvcHtmlString对象。在你的第一个例子中,你有一个常规的C#代码块。所以从那里调用Html.ActionLink()只需执行它并将MvcHtmlString返回给任何人。在第二个示例中,您已跳回到HTML上下文中,因此它再次写入HTML。

您可以使用特殊<text>块来获得的,而不是使用<span>或其他真正的HTML回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; 
+0

我最喜欢的最后一个例子。谢谢! –