Ошибка переноса приложения 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" />
}