是否可以訪問位於另一個項目中的 MVC 視圖?
我想將我的 MVC 項目分成幾個項目
所以首先,我創建了兩個項目Front和Views
Front項目是一個包含控制器和模型的 Web 應用程序
Views項目是一個僅包含視圖的類庫項目
我的問題是如何讓控制器呼叫位於Views項目中的視圖
我有這樣的控制器:
public ActionResult Default() { return this.View(); }
MVC 不會將視圖編譯成 DLL,而是將它們作為文件從站點目錄的根目錄中引用。按照慣例,該位置是 ~/Views 並遵循搜尋路徑。這或多或少是硬編碼到預設視圖引擎中的。
因為視圖是文件,所以當您將它們分解為一個單獨的項目時,它們將不會存在於您的主 Web 應用程序項目中。因此,視圖引擎找不到它們。編譯應用程序時,任何引用的項目都只會複製 DLL(可能還有其他一些東西,如 pdb 等)
現在,有一些方法可以解決這個問題,但老實說,它們通常帶來的麻煩多於其價值。您可以查看 mvc contrib 項目中的“可移植區域”,但這些都沒有得到很好的支持,並且有人談論用 NuGet 打包替換它們。
您也可以按照@mo.esmp 的建議創建自定義視圖引擎,但您仍然需要想辦法將視圖複製到站點在建構和/或部署時可以訪問它們的位置。
我的建議是不要以您描述的方式分解項目。我看不出它有什麼價值。如果您的項目變得如此之大,我會將您的程式碼分成多個區域,並將您的所有區域程式碼和數據放在一起。
將明顯相互依賴的項目分成單獨的組件,這些組件的唯一目的是根據它們的目的收集東西,這有什麼價值?我看到了將模型分離到他們自己的項目中的一些價值,因為模型可以被多個程序集使用。但是,控制器和視圖僅由 MVC 主站點使用。
要包含控制器,您需要更改路由註冊以告訴他們在哪裡尋找控制器:
routes.MapRoute(name: "Default", url: "{controller}/{action}/{id}", namespaces: new[] {"[Namespace of the Project that contains your controllers]"}, defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional});要包含視圖,請創建自定義
ViewEngine:public class CustomViewEngine: RazorViewEngine { public CustomViewEngine() { MasterLocationFormats = new string[] { "~/bin/Views/{1}/{0}.cshtml", "~/bin/Views/{1}/{0}.vbhtml", "~/bin/Views/Shared/{0}.cshtml", "~/bin/Views/Shared/{0}.vbhtml" }; ViewLocationFormats = new string[] { "~/bin/Areas/{2}/Views/{1}/{0}.cshtml", "~/bin/Areas/{2}/Views/{1}/{0}.vbhtml", "~/bin/Areas/{2}/Views/Shared/{0}.cshtml", "~/bin/Areas/{2}/Views/Shared/{0}.vbhtml" }; . . . } } protected void Application_Start() { ViewEngines.Engines.Add(new CustomViewEngine());有關更多資訊,請查看
RazorViewEngin.這裡有一些不錯的文章:
在 ASP.NET Web API 中使用來自外部程序集的控制器
如何在 ASP.NET MVC 應用程序的外部程序集中呼叫控制器