本篇文章為大家展示了如何自定義View視圖文件查找邏輯,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
成都創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,提供成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);可快速的進(jìn)行網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,是專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!之前MVC5和之前的版本中,我們要想對(duì)View文件的路徑進(jìn)行控制的話,則必須要對(duì)IViewEngine
接口的FindPartialView
或FindView
方法進(jìn)行重寫(xiě),所有的視圖引擎都繼承于該IViewEngine
接口,比如默認(rèn)的RazorViewEngine
。但新版本MVC6中,對(duì)視圖文件的路徑方式卻不太一樣了,目前有兩種方式,一種是通過(guò)RazorViewEngine
,另外一種是通過(guò)新特性IViewLocationExpander
接口。
通過(guò)RazorViewEngine來(lái)控制View路徑
在新版的RazorViewEngine
中,該類提供了兩個(gè)虛屬性(AreaViewLocationFormats
和ViewLocationFormats
),可以用于重寫(xiě)控制,而不必再對(duì)FindPartialView
或FindView
方法進(jìn)行重寫(xiě),示例如下:
public class ThemeViewEngine : RazorViewEngine { public ThemeViewEngine(IRazorPageFactory pageFactory, IRazorViewFactory viewFactory, IViewLocationExpanderProvider viewLocationExpanderProvider, IViewLocationCache viewLocationCache) : base(pageFactory, viewFactory, viewLocationExpanderProvider, viewLocationCache) { } public override IEnumerableAreaViewLocationFormats { get { var value = new Random().Next(0, 1); var theme = value == 0 ? "Theme1" : "Theme2"; // 可通過(guò)其它條件,設(shè)置皮膚的種類 return base.AreaViewLocationFormats.Select(f => f.Replace("/Views/", "/Views/" + theme + "/")); } } public override IEnumerable ViewLocationFormats { get { var value = new Random().Next(0, 1); var theme = value == 0 ? "Theme1" : "Theme2"; // 可通過(guò)其它條件,設(shè)置皮膚的種類 return base.ViewLocationFormats.Select(f => f.Replace("/Views/", "/Views/" + theme + "/")); } } }
然后,通過(guò)修改MVcOptions的實(shí)例屬性ViewEngines即可完成對(duì)視圖引擎的替換,代碼如下:
services.AddMvc().Configure(options => { options.ViewEngines.Clear(); options.ViewEngines.Add(typeof(ThemeViewEngine)); });
這樣,系統(tǒng)在查找視圖文件的時(shí)候,就會(huì)按照新注冊(cè)的ThemeViewEngine
的邏輯來(lái)執(zhí)行。
通過(guò)IViewLocationExpander來(lái)控制View路徑
在MVC6中,微軟還提供了另外一種新的方式來(lái)控制View文件的路徑,那就是IViewLocationExpander
接口,通過(guò)實(shí)現(xiàn)該接口即可實(shí)現(xiàn)自定義邏輯,并且也可以使用相關(guān)的上下文對(duì)象。示例如下:
public class ThemeViewLocationExpander : IViewLocationExpander { public void PopulateValues(ViewLocationExpanderContext context) { var value = new Random().Next(0, 1); var theme = value == 0 ? "Theme1" : "Theme2"; context.Values["theme"] = theme; } public virtual IEnumerableExpandViewLocations(ViewLocationExpanderContext context, IEnumerable viewLocations) { return viewLocations.Select(f => f.Replace("/Views/", "/Views/" + context.Values["theme"] + "/")); } }
在上述自定義的IViewLocationExpander
中,實(shí)現(xiàn)了2個(gè)方法分別是PopulateValues
和ExpandViewLocations
,PopulateValues
方法可以讓我們想ViewLocationExpanderContext
上下文中添加響應(yīng)的鍵值對(duì)以便后續(xù)使用,通過(guò),我們可以利用通過(guò)該上下文對(duì)象,來(lái)查找ActionContext
和HttpContext
對(duì)象,以便利用這些對(duì)象做響應(yīng)的判斷操作;而ExpandViewLocations
方法,只會(huì)在沒(méi)有View緩存或在View緩存里找不到對(duì)應(yīng)key的View文件時(shí)才會(huì)調(diào)用該方法,在該方法內(nèi),我們可以動(dòng)態(tài)返回視圖的位置。
最后,我們?cè)?code>Startup.cs里通過(guò)修改RazorViewEngineOptions
實(shí)例對(duì)象的ViewLocationExpanders
屬性,來(lái)實(shí)現(xiàn)注冊(cè)目的,代碼如下:
services.Configure(options => { options.ViewLocationExpanders.Add(typeof(ThemViewLocationExpander)); });
上述內(nèi)容就是如何自定義View視圖文件查找邏輯,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。