空传播功能和 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=\"Web\" /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.cs
中 Application_Start
的末尾:
ViewEngines.Engines.Add(new RoslynRazorViewEngine());
你好,我有一个奇怪的问题。
我在我的 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=\"Web\" /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.cs
中 Application_Start
的末尾:
ViewEngines.Engines.Add(new RoslynRazorViewEngine());