Подтвердить что ты не робот

Оператор switch внутри Razor CSHTML

Я разрабатываю проект в 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;
    ...
}

Может кто-нибудь объяснить, почему?

Спасибо.

4b9b3361

Ответ 1

Это бесформенность Бритвы. Когда вы находитесь в нормальном HTML и используете код С#, помещая что-то с символом @, он напишет результат на страницу:

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

Это похоже на старую школу <%= %>.

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

Однако метод Html.ActionLink просто возвращает объект MvcHtmlString в мире .NET. В первом примере у вас есть обычный блок кода С#. Поэтому вызов Html.ActionLink() оттуда просто выполняет его и возвращает MvcHtmlString никому. Во втором примере вы вернулись в контекст 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;