空传播功能和 Razor 视图

Null propagation feature and Razor views

你好,我有一个奇怪的问题。

我在我的 razor 页面中像这样使用 null 传播功能

@(Model.ligneDossierLie?.dossier_id)

我的项目是基于4.6.1 Framework的,我用的是最新的codeDom compiler 1.0.4 和编译器 2.1.0

在 razor 视图中,我收到一条错误消息,提示我无法将 C#6 功能与 C#5 一起使用。

但是我的项目使用的是 c#7 ....

我回滚到 c#6,它工作正常。

有人知道在这种情况下如何使用 c#7 吗?

谢谢。

Web.config

 <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
    </compilers>
  </system.codedom>

compilerOptions="/langversion:6

设置为 7,我回滚到 6。之后我不再有错误,我的视图正在编译并正常工作

看来您确实可以使用 C# 6 和 C# 7 的功能,尽管它需要一些工作。

添加这些包:

  • Microsoft.CodeDom.Providers.DotNetCompilerPlatform(当前为 1.0.4)
  • Microsoft.Net.Compilers(当前为 2.1.0)

确保您的 web.config:

中包含此部分
<system.codedom>
  <compilers>
    <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:7 /nowarn:1659;1699;1701" />
    <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
  </compilers>
</system.codedom>

以及 csproj 文件中所需的导入(应该自动存在,但要检查):

<Import Project="..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.4\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.4\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" />
<Import Project="..\packages\Microsoft.Net.Compilers.2.1.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.2.1.0\build\Microsoft.Net.Compilers.props')" />

其中的这个目标:

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> ... </Target>

上一个回答:

您不能使用它,因为 ASP.NET MVC Razor 视图引擎不使用 Roslyn 来编译您的视图。因此它不能使用 C# 6 及更高版本提供的功能(空传播运算符 = C# 6)。

您必须以 C# 6 之前的风格编写代码,或者使用另一个包来利用替代视图引擎,例如 Stack Exchange 创建的视图引擎(感谢 Marc Gravell to point to that): https://github.com/StackExchange/StackExchange.Precompilation

根据他们的文档,您必须包含包:

Install-Package StackExchange.Precompilation.Build -Pre

然后把它放在 Global.asax.csApplication_Start 的末尾:

ViewEngines.Engines.Add(new RoslynRazorViewEngine());