web-dev-qa-db-ja.com

「@」文字の後の予期しない「foreach」キーワード

かみそりで部分的なビューを作成しました。実行すると、次のエラーが発生します。Razorはどこにでもコードを書いていると思い込んでいるようです。

「@」文字の後の予期しない「foreach」キーワード。コード内に入ると、「foreach」のような構成要素の前に「@」を付ける必要はありません。

これが私の見解です:

@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>
27
Jaco Pretorius

usingブロック内では、RazorはHTMLではなくC#ソースを期待しています。

したがって、@なしでforeachと書く必要があります。

HTMLタグ内では、Razorはマークアップを想定しているため、@を使用します。

例えば:

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

@が必要なのは、コードをマークアップが必要な場所に配置する場合、または出力を任意の場所に書き込む場合だけです。

非タグのようなマークアップをコードが必要な場所に配置するには、@:または<text>を使用します。

49
SLaks

マークアップが実際にコードアップ内のコードセクションを妨害することはなく、終了タグに到達するとすぐにマークアップセクションに戻るというSLaks回答を追加したいだけです。

マークアップ内でも同様です。コードの後でも@記号を使用する必要があります。

たとえば、次のようなものだとします。

@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 *@
      }
}
2
yoel halb

私の状況は上記の逆ですが、論理は同じです。

かみそりのサンプルページでイテレータを使用していますが、ページがifおよびforeach構文で直接始まると、上記のエラーが発生します。

@if (Model != null)
{
        @foreach (var place in @Model.ToList())
        {
            <div class="swiper-slide">
                <figure class="popular-visits-card">
                    <img src="@place.ImgUrl" alt="">
                    <figcaption class="content">
                        <p class="title">
                            @place.Name
                        </p>
                        <p class="subtitle">
                            @place.Description
                        </p>
                    </figcaption>
                </figure>
            </div>

        }
}

「@」文字の後の予期しない「foreach」キーワード。コードの内側では、「foreach」のような構成要素の前に「@」を付ける必要はありません。

ifステートメントの後にhtmlタグを使用すると、このエラーは発生しなくなります

@model List<Pupularity>
@{
    Layout = null;
}

@if (Model != null)
{
    <div>
        @foreach (var place in @Model.ToList())
        {
            <div class="swiper-slide">
                <figure class="popular-visits-card">
                    <img src="@place.ImgUrl" alt="">
                    <figcaption class="content">
                        <p class="title">
                            @place.Name
                        </p>
                        <p class="subtitle">
                            @place.Description
                        </p>
                    </figcaption>
                </figure>
            </div>

        }
</div>
}
0
Hamit YILDIRIM