麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > .NET > 正文

解讀ASP.NET 5 & MVC6系列教程(16):自定義View視圖文件查找邏輯

2024-07-10 13:30:52
字體:
來源:轉載
供稿:網友

之前MVC5和之前的版本中,我們要想對View文件的路徑進行控制的話,則必須要對IViewEngine接口的FindPartialViewFindView方法進行重寫,所有的視圖引擎都繼承于該IViewEngine接口,比如默認的RazorViewEngine。但新版本MVC6中,對視圖文件的路徑方式卻不太一樣了,目前有兩種方式,一種是通過RazorViewEngine,另外一種是通過新特性IViewLocationExpander接口。

通過RazorViewEngine來控制View路徑

在新版的RazorViewEngine中,該類提供了兩個虛屬性(AreaViewLocationFormatsViewLocationFormats),可以用于重寫控制,而不必再對FindPartialViewFindView方法進行重寫,示例如下:

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"; // 可通過其它條件,設置皮膚的種類      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"; // 可通過其它條件,設置皮膚的種類      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));});

這樣,系統在查找視圖文件的時候,就會按照新注冊的ThemeViewEngine的邏輯來執行。

通過IViewLocationExpander來控制View路徑

在MVC6中,微軟還提供了另外一種新的方式來控制View文件的路徑,那就是IViewLocationExpander接口,通過實現該接口即可實現自定義邏輯,并且也可以使用相關的上下文對象。示例如下:

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中,實現了2個方法分別是PopulateValuesExpandViewLocationsPopulateValues方法可以讓我們想ViewLocationExpanderContext上下文中添加響應的鍵值對以便后續使用,通過,我們可以利用通過該上下文對象,來查找ActionContextHttpContext對象,以便利用這些對象做響應的判斷操作;而ExpandViewLocations方法,只會在沒有View緩存或在View緩存里找不到對應key的View文件時才會調用該方法,在該方法內,我們可以動態返回視圖的位置。

最后,我們在Startup.cs里通過修改RazorViewEngineOptions實例對象的ViewLocationExpanders屬性,來實現注冊目的,代碼如下:

services.Configure<RazorViewEngineOptions>(options =>{  options.ViewLocationExpanders.Add(typeof(ThemViewLocationExpander));});
 


注:相關教程知識閱讀請移步到ASP.NET教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲精品成人18久久久久 | 成人一区二区三区在线 | 91久久一区 | 在线高清中文字幕 | 国产精品视频自拍 | 久久久国产精品免费观看 | 男女一边摸一边做羞羞视频免费 | 视频一区国产 | 成人激情在线观看 | 欧美成人免费电影 | 日产精品久久久一区二区开放时间 | 国产一区二区三区四区波多野结衣 | chinese乱子伦xxxx国语对白 | 精品在线视频观看 | 久久视频精品 | 欧美乱码精品一区 | 激情视频免费看 | 黄网站在线播放视频免费观看 | 午夜爽爽爽男女免费观看hd | 99精品视频久久精品视频 | 欧美色视 | 成人在线高清视频 | 色视频在线 | 成人精品一区二区三区中文字幕 | 国产一区二区三区手机在线 | 午夜在线视频观看 | 中国嫩模一级毛片 | 一本一本久久a久久精品综合小说 | 国产91丝袜在线播放 | 日本成人在线播放 | 国产精品久久久久久久亚洲按摩 | 九九热精品在线播放 | av中文在线观看 | 一级免费黄色免费片 | 女18一级大黄毛片免费女人 | 欧美亚洲国产成人综合在线 | 欧美1区2区 | 叶子楣成人爽a毛片免费啪啪 | 狠狠干夜夜草 | 精品国产一区二 | 国产自91精品一区二区 |