愛上MVC3系列~改變Areas的FindView順序


回到目錄

我們在開發MVC項目時,由於項目比較大,往往會根據模塊去建立Areas,這樣不僅可以使程序的結構清晰,而且也有利於進行路由的部屬。而在進行Areas的開發時,我們往往會有這樣的情況:

1 Areas下有自己的_Layout模板,而我們希望所有Areas都用公用的(~/views/shared)下的模板,這樣我們應該怎么做呢?

兩個模版的名稱是一樣的,在MVC中它會優先使用那個呢?

這是我們所關注的問題,經過測試表明,在默認情況下,MVC會使用自己Areas里定義的模板,而不會使用View/Shares目錄的,這很正常,因為它的優先級肯定是以離它最近的那個模板為主。

總結 views的查詢順應是:

而如果我們要改變這樣順序,我們可以通過ViewEngines類型下的Engines屬性,它是一個ViewEngineCollection類型的集合,我們可以向里面往很多模板規則,它會以第一個規則為准。而這些規則我們可以向路由規則一樣在global里進行注冊。

   protected void Application_Start()
        {
            #region 注冊頁面引擎
            ViewEngines.Engines.Clear();//清空所有FindView規則
            ViewEngines.Engines.Insert(0, new CustomRazorViewEngine());
            #endregion
...
}
 1  /// <summary>
 2         /// 建立一個頁面搜索引擎,針對Razor
 3         /// 按著自己希望的VIEW定位順序去訂定,默認情況下areas區域的view查詢時,先找自己的areas,然后找view/shared,
 4         /// 我們可以改變它的順序
 5         /// </summary>
 6         private class CustomRazorViewEngine : RazorViewEngine
 7         {
 8             public CustomRazorViewEngine()
 9                 : base()
10             {
11                 base.AreaMasterLocationFormats = new string[]
12                 {
13                       "~/Views/Shared/{0}.cshtml",
14                     "~/Areas/{2}/Views/{1}/{0}.cshtml", 
15                      "~/Areas/{2}/Views/Shared/{0}.cshtml", 
16                    
17                  };
18 
19                 base.AreaViewLocationFormats = new string[] 
20                 { 
21                     "~/Areas/{2}/Views/{1}/{0}.cshtml", 
22                      "~/Areas/{2}/Views/Shared/{0}.cshtml",
23                     "~/Views/Shared/{0}.cshtml"
24                 };
25 
26                 base.AreaPartialViewLocationFormats = base.AreaViewLocationFormats;
27             }
28         }

OK,我們可以看到,我們把"~/Views/Shared/{0}.cshtml"這個規則放到上第1個位置,這時,它會被優先使用。

看來,回頭應該把global里的用法寫個文章了,呵呵。

 

回到目錄

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM