这是一个非常奇怪的错误,我认为它可能是一个剃刀错误。我正在使用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
有没有人遇到过这个问题?
答案 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文件并查看生成的代码。
也许那时你会更容易发现问题。
答案 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" />
}