愛上(shang)MVC3系(xi)列(lie)~改變(bian)Areas的(de)FindView順序
我(wo)們在開(kai)發MVC項(xiang)目時,由于項(xiang)目比較大,往(wang)往(wang)會根據模塊去建立Areas,這樣不(bu)僅(jin)可以(yi)使程序(xu)的結構(gou)清晰,而(er)且也(ye)有利于進行路由的部(bu)屬(shu)。而(er)在進行Areas的開(kai)發時,我(wo)們往(wang)往(wang)會有這樣的情況(kuang):
1 Areas下(xia)有自己的_Layout模板(ban),而我(wo)們(men)希(xi)望(wang)所(suo)有Areas都(dou)用公(gong)用的(~/views/shared)下(xia)的模板(ban),這(zhe)樣我(wo)們(men)應該怎(zen)么做呢?
兩個模版的(de)名稱是(shi)一(yi)樣的(de),在MVC中它會優先使用那(nei)個呢(ni)?
這是我們所(suo)關(guan)注的(de)問題,經過測試表(biao)明,在默認情(qing)況(kuang)下(xia),MVC會(hui)使用(yong)自己Areas里定義的(de)模(mo)板,而不(bu)會(hui)使用(yong)View/Shares目錄的(de),這很正常(chang),因(yin)為它的(de)優先(xian)級肯(ken)定是以(yi)離它最近的(de)那個模(mo)板為主。
總結 views的(de)查詢順(shun)應是:
而如果我(wo)們(men)要改(gai)變這(zhe)樣順序,我(wo)們(men)可(ke)以通(tong)過ViewEngines類(lei)型下的(de)Engines屬性,它是一個ViewEngineCollection類(lei)型的(de)集合,我(wo)們(men)可(ke)以向里(li)面往很多模板(ban)規則,它會以第一個規則為準。而這(zhe)些規則我(wo)們(men)可(ke)以向路由規則一樣在global里(li)進(jin)行注冊。
protected void Application_Start() { #region 注冊頁面引擎 ViewEngines.Engines.Clear();//清(qing)空所有FindView規則(ze) ViewEngines.Engines.Insert(0, new CustomRazorViewEngine()); #endregion
...
}
1 /// <summary> 2 /// 建(jian)立一個頁面搜(sou)索(suo)引擎,針對Razor 3 /// 按著自己(ji)希望的VIEW定位順序去(qu)訂定,默認情況下areas區(qu)域(yu)的view查(cha)詢時,先找自己(ji)的areas,然后找view/shared, 4 /// 我們可(ke)以(yi)改變它的(de)順序 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"這(zhe)個規則放到(dao)上第1個位置,這(zhe)時,它會被優先使用。
看來,回頭應該把global里的用法寫個文章了,呵呵。