Неожиданное ключевое слово "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>
Ответы
Ответ 1
Внутри блока using
Razor ожидает источник С#, а не HTML.
Следовательно, вы должны написать 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>
.
Ответ 2
Я просто хочу добавить к 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 *@
}
}
Ответ 3
Моя ситуация противоположна вышесказанному, но логика та же.
Я использую итератор на странице примера бритвы, и я получаю вышеуказанную ошибку, если моя страница начинается напрямую с синтаксиса 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", перед "@".
если я использую html-тег после оператора if, я больше не получаю эту ошибку
@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>
}