我們在開發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里的用法寫個文章了,呵呵。