解讀ASP.NET 5 & MVC6系列教程(16):自定義View視圖文件查找邏輯
之前MVC5和之前的版本中,我們要想對(duì)View文件的路徑進(jìn)行控制的話,則必須要對(duì)IViewEngine接口的FindPartialView或FindView方法進(jìn)行重寫,所有的視圖引擎都繼承于該IViewEngine接口,比如默認(rèn)的RazorViewEngine。但新版本MVC6中,對(duì)視圖文件的路徑方式卻不太一樣了,目前有兩種方式,一種是通過RazorViewEngine,另外一種是通過新特性IViewLocationExpander接口。
通過RazorViewEngine來控制View路徑
在新版的RazorViewEngine中,該類提供了兩個(gè)虛屬性(AreaViewLocationFormats和ViewLocationFormats),可以用于重寫控制,而不必再對(duì)FindPartialView或FindView方法進(jìn)行重寫,示例如下:
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的實(shí)例屬性ViewEngines即可完成對(duì)視圖引擎的替換,代碼如下:
services.AddMvc().Configure<MvcOptions>(options =>
{
options.ViewEngines.Clear();
options.ViewEngines.Add(typeof(ThemeViewEngine));
});
這樣,系統(tǒng)在查找視圖文件的時(shí)候,就會(huì)按照新注冊(cè)的ThemeViewEngine的邏輯來執(zhí)行。
通過IViewLocationExpander來控制View路徑
在MVC6中,微軟還提供了另外一種新的方式來控制View文件的路徑,那就是IViewLocationExpander接口,通過實(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 IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context,
IEnumerable<string> 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ù)使用,通過,我們可以利用通過該上下文對(duì)象,來查找ActionContext和HttpContext對(duì)象,以便利用這些對(duì)象做響應(yīng)的判斷操作;而ExpandViewLocations方法,只會(huì)在沒有View緩存或在View緩存里找不到對(duì)應(yīng)key的View文件時(shí)才會(huì)調(diào)用該方法,在該方法內(nèi),我們可以動(dòng)態(tài)返回視圖的位置。
最后,我們?cè)?code>Startup.cs里通過修改RazorViewEngineOptions實(shí)例對(duì)象的ViewLocationExpanders屬性,來實(shí)現(xiàn)注冊(cè)目的,代碼如下:
services.Configure<RazorViewEngineOptions>(options =>
{
options.ViewLocationExpanders.Add(typeof(ThemViewLocationExpander));
});
相關(guān)文章
《解剖PetShop》之二:PetShop數(shù)據(jù)訪問層數(shù)之據(jù)庫訪問設(shè)計(jì)
本文主要講解PetShop4.0的數(shù)據(jù)訪問層設(shè)計(jì),包括:數(shù)據(jù)庫訪問、Messaging、MemberShip、Profile四部分,需要的朋友可以參考下。2016-05-05
《解剖PetShop》之五:PetShop之業(yè)務(wù)邏輯層設(shè)計(jì)
業(yè)務(wù)邏輯層(Business Logic Layer)無疑是系統(tǒng)架構(gòu)中體現(xiàn)核心價(jià)值的部分,本文主要講解PetShop4.0的業(yè)務(wù)邏輯層設(shè)計(jì),需要的朋友可以參考下。2016-05-05
解讀ASP.NET 5 & MVC6系列教程(16):自定義View視圖文件查找邏輯
這篇文章主要介紹了ASP.NET 5 MVC6中自定義View視圖文件查找邏輯,需要的朋友可以參考下2016-06-06
《解剖PetShop》之四:PetShop之ASP.NET緩存
本文主要講解PetShop4.0的ASP.NET緩存,極大的提高的網(wǎng)站的性能,需要的朋友可以參考下。2016-05-05
在ASP.NET 2.0中操作數(shù)據(jù)之十:使用 GridView和DetailView實(shí)現(xiàn)的主/從報(bào)表
本文我們主要研究了如何使用可選擇行的GridView顯示主記錄,以及在DetailsView中顯示選中記錄的詳細(xì)信息。2016-05-05
解讀ASP.NET 5 & MVC6系列教程(9):日志框架
這篇文章主要介紹了ASP.NET 5 日志框架,通過基于接口的編程機(jī)制和DI依賴注入機(jī)制,我們可以很容易實(shí)現(xiàn)第三方日志provider的擴(kuò)展,從而將日志記錄到我們想記錄的任意地方,需要的朋友可以參考下2016-06-06
在ASP.NET 2.0中操作數(shù)據(jù)之六十一:在事務(wù)里對(duì)數(shù)據(jù)庫修改進(jìn)行封裝
事務(wù)的最主要的一個(gè)作用就是保證數(shù)據(jù)的完整性,本文主要介紹ASP.NET 2.0中使用事務(wù)對(duì)修改數(shù)據(jù)進(jìn)行封裝,這些包含事務(wù)的命令要么都執(zhí)行成功要么都執(zhí)行失敗。2016-05-05
解讀ASP.NET 5 & MVC6系列教程(8):Session與Caching
這篇文章主要介紹了ASP.NET 5 中的Session與Caching配置和使用,需要的朋友可以參考下2016-06-06
在ASP.NET 2.0中操作數(shù)據(jù)之六十三:GridView實(shí)現(xiàn)批量刪除數(shù)據(jù)
本文主要介紹在GridView控件中包含一個(gè)checkbox列來實(shí)現(xiàn)復(fù)選多條數(shù)據(jù),在批量刪除按鈕的事件中通過for循環(huán)來一一刪除。2016-05-05

