Switch-sætningen inde Razor CSHTML

Jeg er ved at udvikle et projekt i ASP.NET MVC4, Twitter.Bootstap 3.0.0 og Razor. I en Udsigt, jeg er nødt til at vise knapper, afhængig af ejendommens værdi. Hjælp switch erklæring, eksemplet nedenfor ikke virker (vises der intet):

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

Ændrer sig en smule, ved hjælp af en <span> tag, den kode virker:

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

Kan nogen forklare hvorfor?

Tak.

OriginalForfatteren Cigano Morrison Mendez | 2013-10-06

1 svar

  1. 19

    Det er funkiness af Skraber. Når du er i normal HTML og bruge C# kode, at sætte noget med en @ symbol på det skriver resultatet til side:

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

    Dette svarer til den gamle skole <%= %>.

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

    Dog, Html.ActionLink metode blot returnerer en MvcHtmlString objekt i .NETTO verden. I dit første eksempel, at du har fået en regelmæssig C# kode blok. Så ringer Html.ActionLink() fra, at der ganske enkelt udfører den og returnerer den MvcHtmlString til ingen. I dit andet eksempel, har du sprang tilbage i HTML sammenhæng, så det skriver HTML-igen.

    Du kan bruge den særlige <text> blok at komme tilbage til HTML-i stedet for at bruge <span> eller anden fast HTML, og det vil skrive direkte uden at skrive den ekstra HTML:

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

    Du kan også bruge den samme @: syntaks:

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

    Du kan læse mere om begge her

    REDIGERE

    Faktisk, i dette tilfælde, du ikke har brug for den ene. Du skal bare @ symbol, som vil være nok til at få dig tilbage i HTML:

    case Enums.Stage.ReadyToStart:
        @Html.ActionLink(Language.Start, "Start", new { id=Model.ProcessId }, new { @class = "btn btn-success" })
        break;
    Jeg kunne godt lide det meste af det sidste eksempel. Tak!

    OriginalForfatteren Joe Enos

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *