空传播特征和剃刀视图

时间:2017-05-03 10:09:25

标签: c# razor asp.net-mvc-5 c#-7.0

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

我在像这样的剃刀页面中使用空传播功能

@(Model.ligneDossierLie?.dossier_id)

我的项目基于4.6.1 Framework,我使用的是最后一个codeDom编译器1.0.4 和编译器2.1.0

在剃须刀视图中,我收到一条错误消息,指出我不能在C#5中使用C#6功能。

但我的项目是使用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.之后我没有出现错误,我的观点正在编译并且正常工作

1 个答案:

答案 0 :(得分:8)

看起来你确实可以使用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指向): https://github.com/StackExchange/StackExchange.Precompilation

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

Install-Package StackExchange.Precompilation.Build -Pre

然后将其放在Application_StartGlobal.asax.cs的末尾:

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