问题将MVC3应用程序迁移到MVC4:编译器错误消息:CS1513:}预期

时间:2012-10-09 23:26:31

标签: razor asp.net-mvc-4

这是一个非常奇怪的错误,我认为它可能是一个剃刀错误。我正在使用VS 2012,MVC4,Framework 4.5。

按照以下说明操作:http://www.asp.net/whitepapers/mvc4-release-notes#_Toc303253806 我创建了一个新的MVC4项目,然后从MVC3项目中将所有代码(控制器,视图,视图模型)复制到它。

Eveything工作得很好,直到我测试了一个有自定义助手的View,里面有一个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

有没有人遇到过这个问题?

6 个答案:

答案 0 :(得分:21)

MVC4的Razor解析器与MVC3不同。 Razor v3具有高级解析器功能,另一方面严格解析与MVC3相比。

如果您没有以正确的方式使用razor语法,则在将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 }

答案 1 :(得分:6)

我有完全相同的问题。

在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中删除了@并且razor正确地解析了代码。

希望它有所帮助。

答案 2 :(得分:4)

我也遇到了这个“预期的”问题,罪魁祸首在HTML评论中是一个撇号这似乎是Razor中的一个错误。

以下是有关如何在VS 2012的默认MVC 4应用程序中重现此问题的示例。只需将以下注释与撇号添加到default.cshtml中的@section featured {}。从评论中删除撇号,它可以正常工作。

@section featured {
    <!-- hello world it's 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>
}

答案 3 :(得分:0)

尝试在web.config中添加此行

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

现在,在收到错误时,您应该能够打开临时生成的.cs文件并查看生成的代码。

也许那时你会更容易发现问题。

详情请见Debugging ASP.NET generated code

答案 4 :(得分:0)

最有帮助的事情就是在VS2012中解决6/10这些问题

文件&GT;源控制 - &gt;高级 - &gt;格式化此文档。

这将解决任何未关闭的div的条件语句,即使是ul和li也会导致.net的大错误。

答案 5 :(得分:0)

我遇到了此错误,但将其缩小为缺少斜线以关闭标记。这适用于MVC3:

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

但不是MVC4。它需要这个:

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