2011-02-09 16 views
27

Mam częściowy widok wykonany w maszynce do golenia. Kiedy go uruchomię, pojawia się następujący błąd - wydaje mi się, że Razor wpada w myśl, że piszę kod wszędzie.Niespodziewane słowo kluczowe "foreach" po znaku "@"

Nieoczekiwane słowo kluczowe "foreach" po znaku "@". Raz wewnątrz kodu, nie trzeba poprzedzić konstrukcje typu "foreach" z "@"

Oto mój widok:

@model IEnumerable<SomeModel> 

<div> 
@using(Html.BeginForm("Update", "UserManagement", FormMethod.Post)) { 

    @Html.Hidden("UserId", ViewBag.UserId) 

@foreach(var link in Model) { 
    if(link.Linked) { 
     <input type="checkbox" name="userLinks" value="@link.Id" checked="checked" />@link.Description<br /> 
    } else { 
     <input type="checkbox" name="userLinks" value="@link.Id" />@link.Description<br />   
    } 
} 

} 
</div> 

Odpowiedz

47

Wewnątrz bloku using, Razor spodziewa C# źródła, a nie HTML .

Dlatego należy pisać foreach bez numeru @.

Wewnątrz znacznika HTML Razor oczekuje znaczników, więc należy użyć @.

Na przykład:

<div> 
    <!-- Markup goes here --> 
    @if (x) { 
     //Code goes here 
     if (y) { 
      //More code goes here 
      <div> 
       <!-- Markup goes here --> 
       @if (z) { } 
      </div> 
     } 
    } 
</div> 

tylko potrzebne jest @ jeśli chcesz umieścić kod gdzie spodziewa znaczników, albo jeśli chcesz napisać wyjście wszędzie.

Aby umieścić znaczniki bez znacznika w miejscu, w którym oczekuje kod, należy użyć @: lub <text>.

+2

+1 - Jestem znalezienie tego, aby być moim # 1 przeszkodą w uczeniu się brzytwy. Mój mózg po prostu nie dostrzega różnicy natychmiast. Poprawia się na tym, ale nadal uważam, że piszę coś niewłaściwego, a następnie muszę przemyśleć to jeszcze raz. –

+0

Tak; to subtelne, ale ważne rozróżnienie. Planuję napisać o tym wpis na blogu jako część mojej serii Razsenting Razor, ale wciąż jest jeszcze 4 części, które muszą być na pierwszym miejscu. – SLaks

+0

@Slaks - Yah, przeskakiwanie pomiędzy kodem a znacznikami tak po prostu wydaje mi się błędne. Jest to odrętwiały umysł, odkąd byłem w "kodzie lub znaczniku, ale nie w obu" środowisku od kilku lat. Zdecydowanie jednak warta tymczasowej frustracji. Pijam koolaid brzytwę w wielkim stylu. –

2

Po prostu chcę dodać do odpowiedzi SLaks, że znaczniki faktycznie nie zakłócają sekcji kodu tylko wewnątrz znaczników, a gdy tylko znacznik zamykający zostanie osiągnięty, powraca do sekcji znaczników.

Podobnie jest w znacznikach, musisz użyć symbolu @ nawet po kodzie.

powiedzieć na przykład zostały następujące:

@if(true) { 
     <span> 
      Markup section here, you need to include the @symbol 
      @if(1 = 1) 
      { 
      } 
      @if(2 = 2) @* The @ symbol here is required *@ 
      { 
      }     
     </span> 
     @: Code section back here, to output you need the "@:" symbol to display markup, although it is after the markup 
     if(false) @* Here the @ symbol isn't required *@ 
     { 
      some_statment; @* This will not be sent to the browser *@ 
      @display_someStament @* If we want to send it to the browser, 
        then we need the @ symbol even in the code section *@ 
     } 
}