web-dev-qa-db-ja.com

Razor CSHTML内のswitchステートメント

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のファンキーさです。通常のHTMLでC#コードを使用している場合、_@_記号を何かに付けると、結果がページに書き込まれます。

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

これは、昔ながらの_<%= %>_に似ています。

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

ただし、Html.ActionLinkメソッドは.NETの世界ではMvcHtmlStringオブジェクトを返すだけです。最初の例では、通常のC#コードブロックがあります。したがって、そこからHtml.ActionLink()を呼び出すと、それが実行され、MvcHtmlStringが誰にも返されません。 2番目の例では、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;
_
23
Joe Enos