Search code examples
asp.net-mvc-3razor

Unexpected "foreach" keyword after "@" character


I have a partial view done in razor. When I run it I get the following error - it seems like Razor gets stuck into thinking I'm writing code everywhere.

Unexpected "foreach" keyword after "@" character. Once inside code, you do not need to prefix constructs like "foreach" with "@"

Here is my view:

@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>

Solution

  • Inside your using block, Razor is expecting C# source, not HTML.

    Therefore, you should write foreach without an @.

    Inside an HTML tag, Razor expects markup, so you would use @.

    For example:

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

    You only need an @ if you want to put code where it's expecting markup, or if you want to write output anywhere.

    To put non-tag-like markup where it's expecting code, use @: or <text>.