MVC3升级到MVC4 RTM手动升级问题:在此关键字前面加上@会引发错误。

4

我有一个MVC3项目,其中有一行代码,以前可以正常运行:

@if (this.Model.ShowAddButton)
{ 
    @this.Html.ActionLink("Add", "Add")
}

我们团队有一个编码指南,所有本地方法调用都需要以this为前缀。在MVC3中一直运行良好,但是现在手动将项目升级到MVC4后,使用这里的指南,上述代码出现以下错误信息:
Unexpected "this" keyword after "@" character.  Once inside code, you do not need to prefix constructs like "this" with "@".

我认为错误提示信息有误导性。它表明这样做是合法的,但不必要。我故意这样做,即使我知道不需要遵循编码指南。解析器失败的事实应该表明“一旦进入代码,您不能添加前缀...”。我知道在嵌套代码块中不能使用“@”,问题不在于“@”符号,而在于使用“this”。将“this”添加到语句中不会影响调用的结果,因此我不明白为什么会抛出异常。我可以通过删除“this”来解决这个问题:
@if (this.Model.ShowAddButton)
{ 
    @Html.ActionLink("Add", "Add")
}

但是这样做会与我们的编码规范产生冲突。所以我的问题是,这是MVC4中故意更改的内容(因为在MVC3中它运行得很好)。还是这是MVC4中的一个错误?如果我删除if块,我仍然可以使用this关键字。

@this.Html.ActionLink("Add", "Add")

你尝试过只是删除this前面的@符号吗? - Forty-Two
那样做是行不通的。如果你这样做,代码会被执行但是没有任何东西被渲染出来。@符号告诉调用结果要被渲染到响应中。 - Chris Nelson
我刚把我的项目从mvc3升级到mvc4,但是我遇到了同样的问题。我使用resharper 7来清理我的视图文件,在清理配置中,会在每个“Html”之前添加一个“this”。我在整个项目中进行了“查找和替换”,将“this.Html”替换为“Html”,这解决了问题。虽然这是一个问题,但我已经更改了resharper的配置,以防止添加“this”,尽管它并不完美。我很惊讶这个问题被downvote了。有人遇到过同样的问题吗?谢谢Chris... +1 - Samuel
1个回答

4

实际上这是MVC4中的一个漏洞。已经有报告进行了提交。

两种解决方法如下:

@if (this.Model.ShowAddButton)
{ 
    @Html.ActionLink("Add", "Add")
}

或者

@if (this.Model.ShowAddButton)
{ 
    @(this.Html.ActionLink("Add", "Add"))
}

我正在使用:@:@(this.Html.ActionLink("添加", "添加")) - Carl G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接