2013-10-06 14 views
13

Pracuję nad projektem w ASP.NET MVC4, Twitter.Bootstap 3.0.0 i Razor. W widoku trzeba wyświetlać przyciski w zależności od wartości właściwości. Użycie instrukcji switch, przykład poniżej nie działa (nic nie jest wyświetlane):Instrukcja zmiany wewnątrz maszynki Razor 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; 
    ... 
} 

Zmiana trochę, używając <span> znacznik, kod działa:

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

Może ktoś wyjaśnić, dlaczego?

Dzięki.

Odpowiedz

18

To funkcyjność maszynki Razor. Kiedy jesteś w normalnym HTML i użyć kodu C#, stawiając coś z @ symbol na nim zapisze wynik do strony

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

ten jest podobny do starego-szkoły <%= %>.

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

Jednak metoda Html.ActionLink prostu zwraca MvcHtmlString obiekt w świecie .NET. W twoim pierwszym przykładzie masz regularny blok kodu C#. Stąd wywołanie Html.ActionLink() po prostu wykonuje ją i zwraca MvcHtmlString nikomu. W drugim przykładzie wróciłeś do kontekstu HTML, więc ponownie pisze HTML.

Można użyć specjalnego <text> blok wrócić do HTML zamiast używać <span> lub innego prawdziwego HTML i będzie pisać bezpośrednio bez pisania dodatkowego kodu HTML:

case Enums.Stage.ReadyToStart: 
    <text>@Html.ActionLink(Language.Start, "Start", new { id=Model.ProcessId }, new { @class = "btn btn-success" })</text> 
    break; 

Można również użyć podobnego @: składnia:

case Enums.Stage.ReadyToStart: 
    @:@Html.ActionLink(Language.Start, "Start", new { id=Model.ProcessId }, new { @class = "btn btn-success" }) 
    break; 

można przeczytać więcej na temat zarówno here

EDYTOWANIE

Właściwie w tym przypadku nie potrzebujesz żadnego z nich. Potrzebujesz tylko symbolu @, który wystarczy, aby powrócić do HTML:

case Enums.Stage.ReadyToStart: 
    @Html.ActionLink(Language.Start, "Start", new { id=Model.ProcessId }, new { @class = "btn btn-success" }) 
    break; 
+0

Podobało mi się większość ostatniego przykładu. Dzięki! –

Powiązane problemy