【问题标题】:Issue migrating MVC3 Application to MVC4: Compiler Error Message: CS1513: } expected将 MVC3 应用程序迁移到 MVC4 的问题:编译器错误消息:CS1513:} 预期
【发布时间】:2012-09-30 08:44:28
【问题描述】:

这是一个非常奇怪的错误,我认为它可能是一个剃刀错误。我正在使用 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

有人遇到过这个问题吗?

【问题讨论】:

  • 没有看到代码,您好像缺少分号或右大括号?
  • 我很确定我没有遗漏任何东西。如果我错过了什么,为什么它会在 MVC3 而不是 MVC4 上工作,是否有任何剃须刀规范改变?
  • 向我们展示代码!这很可能是您的 Razor 语法有问题,可能是您在复制和粘贴时意外引入的错误。
  • 这个错误更有可能是之前没有被捕获的东西——也就是说,新编译器比旧编译器正确。
  • 我用代码更新了我的问题,感谢您的帮助!

标签: razor asp.net-mvc-4


【解决方案1】:

我遇到了此错误,但将其缩小为缺少斜线以关闭标记。这在 MVC3 中有效:

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

但在 MVC4 中没有。它需要这个:

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

【讨论】:

    【解决方案2】:

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

    如果您没有以正确的方式使用 razor 语法,则在将 MVC3 转换为 MVC4 时可能会遇到语法错误。

    一些常见的 Razor v2 中不允许出现的 Razor 代码错误的解决方法是:

    --> 避免在视图中使用服务器块,除非有变量声明部分。

    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 }
    

    【讨论】:

    • 谢谢,这该死的很难找到。而且我的代码库并没有那么大。他们应该真正修复这些错误消息。谢谢!
    • 我同意! “} 预期”并没有告诉我去哪里解决问题!将其缩小到文件是不够的。这是什么,70 年代?
    • 谢谢!为什么微软在升级到 MVC4 文档时没有警告我们处理 Razor 语法问题——尤其是因为它们很难找到?
    • 谢谢@Model => Model,真的帮了我!!
    【解决方案3】:

    我遇到了完全相同的问题。

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

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

      我也遇到了这个“预期的 }”问题,而罪魁祸首竟然是 HTML 注释中的撇号 这似乎是 Razor 中的一个错误。

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

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

      【讨论】:

      • 感谢 Hector,目前我无法解决我的问题,我已经删除了所有我的 razor 和 javascript cmets(我没有任何 html 注释),没有任何效果。
      • 然后我删除了所有的javascript(我有一些撇号),但再次没有任何效果。目前我没有时间测试更多,所以我将我的应用程序保留在 MVC3 中。但是以后如果我找到什么我会告诉你的!谢谢!
      • 值得注意的是,如果评论包含撇号并且不在@section 内,则不会产生错误消息,但在运行时仍然会出错,包括(但不一定限于) ~/path/to/your/file URL 的解析。
      • 哇,今天也遇到了同样的问题,想不到是什么原因造成的。谢谢!
      【解决方案5】:

      在 VS2012 中为您解决其中 6/10 的最有帮助的事情

      文件-> 源代码管理-> 高级-> 格式化此文档。

      这将解决任何未关闭的 div、条件语句,甚至是 ul 和 li,它们会导致 .net 出现大错误。

      【讨论】:

        【解决方案6】:

        这可能是一个长远的目标,但有时如果您使用关键字会导致该错误

        关键字列表 VS 2012 http://msdn.microsoft.com/en-us/library/x53a06bb%28v=vs.110%29.aspx

        我知道 4.5 的两个新关键字是 await 和 async

        请参阅以下内容以了解我所说的示例 http://www.wduffy.co.uk/blog/css-class-property-asp-net-mvc-htmlattributes/

        【讨论】:

        • 哇,这太糟糕了。 var @checked = yes ? "checked" : "" 的单选选项今天刚刚打到我。
        【解决方案7】:

        尝试在web.config中添加这一行

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

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

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

        详情看这里Debugging ASP.NET generated code

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多