Ошибка переноса приложения MVC3 в MVC4: сообщение об ошибке компилятора: CS1513:} ожидается

Это действительно странная ошибка, я думаю, что это может быть ошибка бритвы. Я использую VS 2012, MVC4, Framework 4.5.

Следуя этим инструкциям: http://www.asp.net/whitepapers/mvc4-release-notes#_Toc303253806 Я создал новый проект MVC4, а затем я скопировал весь мой код (контроллеры, представления, режимы просмотра) из проекта MVC3.

Eveything работал отлично, пока я не проверил один вид, у которого есть пользовательский помощник, и внутри него он имеет один foreach, один switch, три if, а затем я вызываю и другие пользовательские помощники.

Это точно тот же код в обоих проектах, в MVC3 он работает, но в MVC4 он показывает это сообщение:

Compiler Error Message: CS1513: } expected

Итак, я попытался добавить одну фигурную скобку, но она показывает ту же ошибку, поэтому я продолжаю добавлять скобки, и она не перестанет говорить мне то же самое.

Я искал эту проблему, но я просто нашел этот вопрос без ответа: http://www.1771.in/asp-net-mvc-4-issues-migrating-mvc3-view-in-vs-2012-rc.html

Кто-нибудь испытал эту проблему?

Ответ 1

Парсер Razor MVC4 отличается от MVC3. Razor v3 обладает расширенными функциями парсера, а с другой стороны, строгий синтаксический анализ сравним с MVC3.

При преобразовании MVC3 в MVC4 вы можете столкнуться с синтаксической ошибкой, если вы не использовали синтаксисы бритвы правильным образом.

Решение некоторых распространенных ошибок кода бритвы, которые не допускаются в Razor v2, следующие:

- > Избегайте использования блоков сервера в представлениях, если не существует раздела объявления переменных.

Don’t : @{if(check){body}}
Recommended : @if(check){body}

- > Избегайте использования @, когда вы уже находитесь в области сервера.

Don’t : @if(@variable)
Recommended : @if(variable)

Don't : @{int a = @Model.Property }
Recommended : @{int a = Model.Property }

Ответ 2

У меня была точно такая же проблема.

В Razor MVC3 я обращался к таким варам следующим образом: @vSuggestion, но в MVC4 @не требуется.

В моем примере у меня был этот код в MVC3:

@{
    var vSuggestion = ((dynamic)ViewData["suggestion"]);   
}
<!-- more code here --> 
@{ int suggestion = @vSuggestion;
   switch (suggestion)
   {
       case Suggestion.INCORRECT_PASSWORD:
       case Suggestion.USER_ALREADY_IN_DATABASE:  
           <span>Trata de iniciar sesión de nuevo</span><br />
           <span>Recupera tu contraseña @Html.ActionLink("aquí", "Recover", "Account")</span>
       break;
       case Suggestion.EMAIL_DONT_EXISTS:  
           <span>Comprueba que el correo electrónico está bien escrito</span><br />
           <span>Registrate (abajo)</span>
       break;
   }                 
}

В MVC4 Razor не улавливал первую фигурную скобку из инструкции switch. Поэтому я удалил @из @vSuggestion, и бритва проанализировала код правильно.

Надеюсь, что это поможет.

Ответ 3

Я столкнулся с этой "ожидаемой" проблемой, и виновник оказался апострофом в комментарии HTML. Это похоже на ошибку в Razor.

Вот пример того, как воспроизвести эту проблему в стандартном приложении MVC 4 с VS 2012. Просто добавьте следующий комментарий с апострофом к @section, представленному {} в default.cshtml. Удалите апостроф из комментария, и он работает нормально.

@section featured {
    <!-- hello world it not cool --> 
    <section class="featured">
        <div class="content-wrapper">
            <hgroup class="title">
                <h1>@ViewBag.Title.</h1>
                <h2>@ViewBag.Message</h2>
            </hgroup>
            <p>...</p>
        </div>
    </section>
}

Ответ 4

Это может быть более длинный снимок, но иногда, если вы используете ключевое слово, это приведет к ошибке

Список ключевых слов VS 2012 http://msdn.microsoft.com/en-us/library/x53a06bb%28v=vs.110%29.aspx

Я знаю, что два новых ключевых слова ждут и асинхронны для 4.5

Для примера того, о чем я говорю, см. следующее. http://www.wduffy.co.uk/blog/css-class-property-asp-net-mvc-htmlattributes/

Ответ 5

Попробуйте добавить эту строку в web.config

<compilation debug="true" batch="false">

Теперь при получении ошибки вы сможете открыть временный сгенерированный файл .cs и взглянуть на сгенерированный код.

Может быть, тогда вам будет легче обнаружить проблему.

Подробнее смотрите здесь Отладка сгенерированного кода ASP.NET

Ответ 6

Самое полезное, что нужно сделать, это решить 6/10 из них для вас в VS2012

Файл- > Управление источником → Дополнительно → Отформатируйте этот документ.

Это разрешит любые незаблокированные div, условные операторы, даже ul и li, которые вызывают большие ошибки для .net.

Ответ 7

Я испытал эту ошибку, но сузил ее до отсутствующего косая черта, чтобы закрыть тег. это работало в MVC3:

@helper metatags()
{
  <meta charset="utf-8">
}

но не в MVC4. он требует этого:

@helper metatags()
{
  <meta charset="utf-8" />
}