解讀ASP.NET 5 & MVC6系列教程(16):自定義View視圖文件查找邏輯
之前MVC5和之前的版本中,我們要想對View文件的路徑進行控制的話,則必須要對IViewEngine
接口的FindPartialView
或FindView
方法進行重寫,所有的視圖引擎都繼承于該IViewEngine
接口,比如默認的RazorViewEngine
。但新版本MVC6中,對視圖文件的路徑方式卻不太一樣了,目前有兩種方式,一種是通過RazorViewEngine
,另外一種是通過新特性IViewLocationExpander
接口。
通過RazorViewEngine來控制View路徑
在新版的RazorViewEngine
中,該類提供了兩個虛屬性(AreaViewLocationFormats
和ViewLocationFormats
),可以用于重寫控制,而不必再對FindPartialView
或FindView
方法進行重寫,示例如下:
public class ThemeViewEngine : RazorViewEngine { public ThemeViewEngine(IRazorPageFactory pageFactory, IRazorViewFactory viewFactory, IViewLocationExpanderProvider viewLocationExpanderProvider, IViewLocationCache viewLocationCache) : base(pageFactory, viewFactory, viewLocationExpanderProvider, viewLocationCache) { } public override IEnumerable<string> AreaViewLocationFormats { get { var value = new Random().Next(0, 1); var theme = value == 0 ? "Theme1" : "Theme2"; // 可通過其它條件,設(shè)置皮膚的種類 return base.AreaViewLocationFormats.Select(f => f.Replace("/Views/", "/Views/" + theme + "/")); } } public override IEnumerable<string> ViewLocationFormats { get { var value = new Random().Next(0, 1); var theme = value == 0 ? "Theme1" : "Theme2"; // 可通過其它條件,設(shè)置皮膚的種類 return base.ViewLocationFormats.Select(f => f.Replace("/Views/", "/Views/" + theme + "/")); } } }
然后,通過修改MVcOptions的實例屬性ViewEngines即可完成對視圖引擎的替換,代碼如下:
services.AddMvc().Configure<MvcOptions>(options => { options.ViewEngines.Clear(); options.ViewEngines.Add(typeof(ThemeViewEngine)); });
這樣,系統(tǒng)在查找視圖文件的時候,就會按照新注冊的ThemeViewEngine
的邏輯來執(zhí)行。
通過IViewLocationExpander來控制View路徑
在MVC6中,微軟還提供了另外一種新的方式來控制View文件的路徑,那就是IViewLocationExpander
接口,通過實現(xiàn)該接口即可實現(xiàn)自定義邏輯,并且也可以使用相關(guān)的上下文對象。示例如下:
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 IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations) { return viewLocations.Select(f => f.Replace("/Views/", "/Views/" + context.Values["theme"] + "/")); } }
在上述自定義的IViewLocationExpander
中,實現(xiàn)了2個方法分別是PopulateValues
和ExpandViewLocations
,PopulateValues
方法可以讓我們想ViewLocationExpanderContext
上下文中添加響應(yīng)的鍵值對以便后續(xù)使用,通過,我們可以利用通過該上下文對象,來查找ActionContext
和HttpContext
對象,以便利用這些對象做響應(yīng)的判斷操作;而ExpandViewLocations
方法,只會在沒有View緩存或在View緩存里找不到對應(yīng)key的View文件時才會調(diào)用該方法,在該方法內(nèi),我們可以動態(tài)返回視圖的位置。
最后,我們在Startup.cs
里通過修改RazorViewEngineOptions
實例對象的ViewLocationExpanders
屬性,來實現(xiàn)注冊目的,代碼如下:
services.Configure<RazorViewEngineOptions>(options => { options.ViewLocationExpanders.Add(typeof(ThemViewLocationExpander)); });
相關(guān)文章
基于.net開發(fā)的遵循web標準的個人站點程序包下載
基于.net開發(fā)的遵循web標準的個人站點程序包下載...2006-10-10.NET 2.0獲取配置文件AppSettings和ConnectionStrings節(jié)數(shù)據(jù)的方法
.NET 2.0獲取配置文件AppSettings和ConnectionStrings節(jié)數(shù)據(jù)的方法...2007-12-12《解剖PetShop》之一:PetShop的系統(tǒng)架構(gòu)設(shè)計
PetShop是一個范例,微軟用它來展示.Net企業(yè)系統(tǒng)開發(fā)的能力。本文主要講解PetShop4.0的系統(tǒng)架構(gòu)設(shè)計,需要的朋友可以參考下。2016-05-05在ASP.NET 2.0中操作數(shù)據(jù)之七十二:調(diào)試存儲過程
在開發(fā)過程中,使用Visual Studio的斷點調(diào)試功能可以很方便幫我們調(diào)試發(fā)現(xiàn)程序存在的錯誤,同樣Visual Studio也支持對SQL Server里面的存儲過程進行調(diào)試,下面就讓我們看看具體的調(diào)試方法。2016-05-05《解剖PetShop》之三:PetShop數(shù)據(jù)訪問層之消息處理
本文主要講解PetShop4.0的數(shù)據(jù)訪問層的消息處理部分,需要的朋友可以參考下。2016-05-05解讀ASP.NET 5 & MVC6系列教程(16):自定義View視圖文件查找邏輯
這篇文章主要介紹了ASP.NET 5 MVC6中自定義View視圖文件查找邏輯,需要的朋友可以參考下2016-06-06Microsoft .Net Remoting系列教程之一:.Net Remoting基礎(chǔ)篇
本文主要講解.Net Remoting的基礎(chǔ),需要的朋友可以參考下。2016-05-05在ASP.NET 2.0中操作數(shù)據(jù)之十五:在GridView的頁腳中顯示統(tǒng)計信息
本文主要介紹在GridView中顯示頁腳的實現(xiàn)方法,通過設(shè)置ShowFooter設(shè)置為True,再配合事件和底層的方法從而實現(xiàn)在GridView的頁腳區(qū)域顯示相關(guān)的統(tǒng)計信息。2016-05-05