13

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

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

4

7 回答 7

21

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 }
于 2013-04-08T12:31:14.853 回答
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 中删除了@ 并正确解析了代码。

希望能帮助到你。

于 2013-01-23T11:49:45.887 回答
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>
}
于 2012-12-13T16:37:09.800 回答
1

这可能是一个长镜头,但有时如果您使用关键字,则会导致该错误

关键字列表 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/

于 2012-10-10T22:22:03.860 回答
0

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

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

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

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

有关详细信息,请查看此处调试 ASP.NET 生成的代码

于 2012-10-09T23:38:19.907 回答
0

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

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

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

于 2012-10-16T13:48:15.637 回答
0

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

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

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

@helper metatags()
{
  <meta charset="utf-8" />
}
于 2014-06-25T02:24:05.600 回答