之前MVC5和之前的版本中,我們要想對View文件的路徑進行控制的話,則必須要對IViewEngine
接口的FindPartialView
或FindView
方法進行重寫,所有的視圖引擎都繼承于該IViewEngine
接口,比如默認(rèn)的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 IEnumerablestring> 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 IEnumerablestring> 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().ConfigureMvcOptions>(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 IEnumerablestring> ExpandViewLocations(ViewLocationExpanderContext context,
IEnumerablestring> 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.ConfigureRazorViewEngineOptions>(options =>
{
options.ViewLocationExpanders.Add(typeof(ThemViewLocationExpander));
});
您可能感興趣的文章:- .NET6中哈希算法的簡化用法的實現(xiàn)
- ASP.NET Core項目配置教程(6)
- ASP.NET MVC5+EF6+EasyUI 后臺管理系統(tǒng)(81)-數(shù)據(jù)篩選(萬能查詢)實例
- ASP.NET MVC異步獲取和刷新ExtJS6 TreeStore
- 解讀ASP.NET 5 & MVC6系列教程(17):MVC中的其他新特性
- .NET 6 中的隱式命名空間引用