【问题标题】:The new null-conditional operator in ASP.NET MVC RazorASP.NET MVC Razor 中新的空条件运算符
【发布时间】:2016-01-15 06:31:01
【问题描述】:

所以自从 C# 6.0 出现以来,我一直在大量使用空条件运算符。示例:

Model?.Person?.Zip

但是,我现在有一个解决方案,客户在视图中对域模型进行操作。虽然我会用斧头追捕开发人员,但我发现在视图中进行一些空检查更容易。

但是,当我在 Razor 中执行此操作时:

@Model?.Person?.Zip

我的Model? 被视为动态的,但? 破坏了动态内容,其余部分呈现为文本。

你是怎么解决这个问题的?

【问题讨论】:

  • 只是猜测@(Model?.Person?.Zip)
  • @DieterB 哈哈,这太简单了……而且成功了。惊人的。你能给所有和我一样愚蠢的未来谷歌人一个答案吗?
  • 完成。谢谢确认 ;-)

标签: c# asp.net-mvc razor c#-6.0


【解决方案1】:

只是猜测

@(Model?.Person?.Zip)

【讨论】:

【解决方案2】:

为了一些额外的完整性(我在 Microsoft 的 ASP.NET 团队工作):

正如 Dieter B(和其他一些人)正确指出的那样,@(Model?.Person?.Zip) 将起作用。

@(...) 语法可以被认为是一种“转义语法”,它在将哪些代码解析为表达式方面提供了更大的灵活性。

在构建当前版本的 Razor 时,只有 C# 5,因此不直接支持新的 C# 6 语法。

ASP.NET 团队正在寻求将部分 Razor v4(用于 ASP.NET 5 / MVC 6)对 C# 6 的支持移植回 Razor v3(用于 ASP.NET 4.x / MVC 5) )。

【讨论】:

  • 如果我是正确的,它不是真正的转义字符,而是“?”不是基本的 C#。使用@(),razor 知道括号之间的所有内容都是 C# 代码。它可以扩展到多行,因此您可以在这些块中进行整个计算(是的,甚至在一页上)
  • 确实你是对的,它根本不是一个“转义字符”。它只是简化了 Razor 解析器需要做多少“思考”,因为它不会解析 C#,除非它必须这样做。通过使用@(...),它只需要进行基本的引号/括号匹配,仅此而已。
【解决方案3】:

当您缺少项目中的以下一个或两个 NuGet 包时,也会发生这种情况:

  • Microsoft.CodeDom.Providers.DotNetCompilerPlatform
  • Microsoft.Net.Compilers

【讨论】:

    【解决方案4】:

    只需将目标框架更改为 .NetFramework 4.7 并使用 Nuget 包管理器安装这些包:

    • Microsoft.CodeDom.Providers.DotNetCompilerPlatform
    • Microsoft.Net.Compilers

    然后像这样使用它(注意允许完整 C# 语法而不是部分 Razor 语法的括号):

    @(Model.Country?.Name)
    

    【讨论】:

      猜你喜欢
      • 2012-01-16
      • 2017-08-25
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多