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>

これは old-school に似てい<%= %>ます。

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

ただし、Html.ActionLink メソッドMvcHtmlStringは、.NET の世界で単にオブジェクトを返します。最初の例では、通常の C# コード ブロックがあります。したがって、そこから呼び出すとHtml.ActionLink()、単にそれが実行され、MvcHtmlStringnobody に返されます。2 番目の例では、HTML コンテキストに戻ったので、HTML を再度書き込みます。

特別な<text>ブロックを使用して、または他の実際の HTML を使用する代わりに HTML に戻すことができ<span>、追加の 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 に答える