【问题标题】:Possible breaking change in MVC4 Razor that can be fixed with "@:@"MVC4 Razor 中可能出现的重大更改,可以使用“@:@”修复
【发布时间】:2013-03-21 09:37:41
【问题描述】:

我最近将我的网站从 ASP.NET MVC3 (Razor) 升级到 MVC4 (Razor2),并在此过程中发现 Razor 视图引擎似乎发生了重大变化。

场景(非常简化)如下所示。

@model IEnumerable<string>

@{ Layout = null; }

<!DOCTYPE html>

<html>
    <body>
        <div>
              @foreach (var x in Model)
              {
                  @string.Format("Foo bar: {0}", x) // Errors in MVC4/Razor2
              }
        </div>
    </body>
</html>

这在 MVC3/Razor 中运行良好,但在 MVC4/Razor2 中,string.Format 行会导致以下错误:

“@”字符后出现意外的“字符串”关键字。进入代码后,您无需在“字符串”之类的结构前面加上“@”。

如果您删除 @,视图引擎会要求您使用分号终止 string.Format 行。然而,ReSharper 然后警告(正确):

没有使用纯方法的返回值。

我为此找到的两个修复方法是使用&lt;text&gt;

<text>@string.Format("The value {0}", x)</text>

或者使用@:@的更奇特的方法:

@:@string.Format("The value {0}", x)

这是 Razor 视图引擎中已知且记录在案的更改吗?

【问题讨论】:

  • 在这种情况下来自 resharper 的警告是不正确的,应该向他们报告或禁止。在设计时和运行时生成的 C# 代码之间存在差异,运行时 c# 将使用另一个方法调用包装 string.format,因此它是完全有效的。 Resharper 应该忽略这类错误(你也可以)

标签: asp.net-mvc-3 razor asp.net-mvc-4 razor-2


【解决方案1】:

看起来像一个错误。它适用于String

@foreach (var x in Model)
{
    @String.Format("Foo bar: {0}", x)
}

【讨论】:

  • 很可能是因为String 不是关键字。无论如何有点奇怪的行为,我不确定为什么它会允许 @ 在代码块中开始。
  • @ 必须被允许,因为它是有效的 C#;它用于声明逐字字符串; IE。精确再现特殊字符的字符串。因此,string msg = "test \t message";\t 替换为选项卡,但 string msg = @"test \t message"; 将其保留为 "\t"
  • @ 不必被允许,并且不在 Razor 中。 @ 在标识符之前用于覆盖具有类型名称的关键字。
【解决方案2】:

这确实是我们决定不修复的错误,请注意语法不正确,因为在这种情况下 C# 和标记之间没有转换。

我了解 resharper 会在此处显示警告,但我认为该警告是错误的。

这是供将来参考的错误 https://aspnetwebstack.codeplex.com/workitem/458

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2010-09-23
    相关资源
    最近更新 更多