Asp.net

是否可以訪問位於另一個項目中的 MVC 視圖?

  • June 21, 2014

我想將我的 MVC 項目分成幾個項目

所以首先,我創建了兩個項目FrontViews

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 應用程序的外部程序集中呼叫控制器

如何實現自定義 RazorViewEngine 以在非標準位置查找視圖?

ASP.NET MVC 中單獨程序集中的視圖

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