Asp.net-Mvc

在 .NET 4.7.1 中的 ASP.NET MVC 5 剃刀視圖中引用 netstandard 2.0 類型

  • May 25, 2019

.NET 4.7.1 應該解決我們在netstandard 2.0從完整框架中引用庫時遇到的問題。儘管有一些持續和痛苦的 dll 衝突警告和相關問題,並且需要手動更新到 PackageReferences(參見這個美妙的擴展),但它確實做到了。儘管如此,人們可以讓它工作,雖然見下面的註釋 1,如果我可以說:不幸的是,至少可以說在這個和相關問題上沒有 VStudio 幫助或太多指導,直到現在人們必須找到這樣幫助在 github 上的後台頻道。理想情況下,這個問題本身會得到消息:ASP.NET MVC 5 尚不支持 razor 中的 netstandard ……希望他們只會向我們發送消息,如果是真的!會省不完的浪費時間!但真的是這樣嗎?或者有解決辦法嗎?

這就是 ASP.NET MVC 5 項目(甚至是那些針對 4.7.1 的項目)的問題。儘管普通的 .cs 程式碼可以工作,包括在控制器中,但對於 razor 視圖(文件)中的任何程式碼都不是這樣。.cshtml來自netstandard庫的剃刀視圖中引用的任何類型都完全失敗。

為了重現這個問題並確保它不僅僅是我自己的程式碼,我通過在最新版本的 VStudio 2017(甚至是預覽版,15.7.0 Preview 4.0),然後創建一個netstandard只有幾個類型的新項目,所以我可以練習在 MVC 5 視圖頁面中引用這些類型。果然,它仍然失敗。例如,來自 netstandard 項目的這個簡單類型:

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

如果您在傳遞給頁面的視圖模型中將該列舉作為類型,如果您曾經在剃刀頁面中引用該屬性,您將得到編譯時錯誤,並且在執行時也會出現,說:

“列舉”類型是在未引用的程序集中定義的。您必須添加對程序集“netstandard,Version=2.0.0.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51”的引用。AspMvc5WebApp471

正如那個 repo 中所詳述的,我什至嘗試重新編譯我自己的版本以Microsoft.CodeDom.Providers.DotNetCompilerPlatform在 中引用它web.config,但這並沒有解決問題。

因此,很高興聽到 ASP.NET 團隊或任何其他可能知道如何解決此問題的人的意見,以及該修復可能需要什麼。或者,如果ASP.NET MVC 5 根本無法與netstandard.netstandard某處的路線圖?也許究竟是什麼導致了這次失敗?當然,最高興聽到是否有可以立即應用的修復程序,但無論哪種方式,我們都需要知道,否則netstandard對於我們這些不能直接將 ASP.NET MVC 5 轉儲到一天(盡可能多,在現實世界中……)非常感謝。

(注 1:Net Framework 4.7.1 被我和很多人熱切期盼,曾有一段時間說它會解決很多痛點,但不幸的是它引入了自己的一套無盡的 dll 地獄般的問題,或者看這裡或者這裡或者這裡。例如,參見關於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 中仍然會出現一個紅色波浪線,其中包含有關 Enum 類型缺失的錯誤消息。但由於這不會影響功能(Intellisense 工作並且程式碼執行),我希望現在可以接受。

引用自:https://stackoverflow.com/questions/50165910