ASP.NET 中的参考 netstandard 2.0 类型 .NET 4.7.1 中的 MVC 5 razor 视图

Reference netstandard 2.0 types in ASP.NET MVC 5 razor views in .NET 4.7.1

.NET 4.7.1 旨在解决我们在从完整框架引用 netstandard 2.0 库时遇到的问题。它有点做了,尽管有一些持续和痛苦的 dll 冲突警告和相关问题,并且需要手动更新到 PackageReferences (see this wondeful extension)。尽管如此,人们还是可以让它工作,尽管请参见下面的注释 1,如果我可以说:不幸的是,至少可以说,在这个问题和相关问题上没有 VStudio 帮助或很多指导,直到现在必须找到这样的在 github 的后台频道上提供帮助。理想情况下,这个问题本身会被告知:ASP.NET MVC 5 does NOT yet support netstandard in razor ...希望他们会告诉我们如果是真的!将节省 无尽的 浪费时间!但事实真的如此吗?或者有解决办法吗?

这就是 ASP.NET MVC 5 项目(即使是针对 4.7.1 的项目)的问题。尽管纯 .cs 代码可以工作,包括在控制器中,但对于 razor 视图(.cshtml 文件)中的任何代码,这 不是 正确。来自 netstandard 库的剃刀视图中引用的任何类型都完全失败。

为了重现这个问题并确保它不仅仅是我自己的代码,我在最新版本的VStudio 2017(甚至是Preview版本,15.7.0 Preview 4.0)中重现了这个by making a bran new ASP.NET MVC 5 project (on github),然后创建一个新的 netstandard 项目,其中只有几个类型,这样我就可以练习在 MVC 5 视图页面中引用这些类型。果然,它仍然失败。例如,来自 netstandard 项目的这个简单类型:

public enum AnimalType { Cat, Dog, Zebra, Alligator }

如果您在传递到页面的视图模型中将该枚举设为类型,如果您曾经在剃刀页面中引用该 属性,您将在编译时和运行时遇到错误,说:

The type 'Enum' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. AspMvc5WebApp471

正如该回购协议中所述,我什至尝试重新编译我自己的 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 版本以在 web.config 中引用它,但这并没有解决问题。

因此,很高兴听到 ASP.NET 团队或可能知道如何解决此问题的任何其他人的意见,以及该修复可能需要的内容。或者,如果 ASP.NET MVC 5 还不能与 netstandard 一起使用,那么很高兴知道这是否是消息,如果对 netstandard 的支持可能即将到来 ASP.NET MVC 5 在不久的将来,或者它是否在某处的路线图上?也许究竟是什么导致了这次失败?当然,最高兴的是听到是否有可以立即应用的修复程序,但无论哪种方式,我们都需要知道,否则 netstandard 对于我们这些不能直接转储 ASP.NET 一天学习 MVC 5(在现实世界中,我们想学习多少...)非常感谢。

(注1:Net Framework 4.7.1是我和很多人翘首期盼的,曾经有一段时间说它能解决很多痛点,可惜它引入了自己的一套endless dll hell like problems, or see here, or here, or here。例如,请参阅关于 System.Net.Http 的讨论(并且绑定重定向不只是删除所有冲突警告,它们通常会带来自己的、非常痛苦的东西)。现在有些人一直希望 4.7.2会解决所有这些问题,尽管它没有为我解决这些 ASP.NET MVC 5 问题)

我查看了解决方案(很棒的解释@Nicholas Petersen !!),我发现在 Razor 编译时您缺少对 netstandard.dll 的引用(这就是错误所在)。

我将它添加到编译期间使用的程序集列表中,如下所示:

<add assembly="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" />

我现在看到的部分是这样的:

<system.web>
    <compilation>
        <assemblies>
            <add assembly="System.Web.Mvc, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
            <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" />
        </assemblies>
    </compilation>
</system.web>

通过该更改,我能够让 IDE 向我显示 cshtml 文件中模型的 Intellisense 和呈现的页面!

这是 .NET Framework 4.7.1 上的 运行,我希望它能在 .NET Framework 4.7.2 上运行。还有。

注意:IDE 中仍然会有一个红色波浪线,其中包含有关缺少枚举类型的错误消息。但由于这不会影响功能(Intellisense 工作并且代码运行)我希望现在可以接受。