【Q.Lee.lulu】ASP.NET MVC: 修改ViewLocator來動態切換模板
動態切換view來換主題
[views]
.|
.---[Controler1]
...|
...---[blue]
.... |
.... ---index.aspx
.... |
.... ---Edit.aspx
...---[Red]
.... |
.... ---index.aspx
.... |
.... ---Edit.aspx
.---[Controler2]
...|
...---[blue]
.... |
.... ---hello.aspx
.... |
.... ---report.aspx
...---[Red]
.... |
.... ---hello.aspx
.... |
.... ---report.aspx
這樣,主題view無法獨立出來,不利於分離主題,管理主題。
而我覺得,最理想的結構是
[views]
.|
.---[blue]
...|
...---[Controler1]
.... |
.... ---index.aspx
.... |
.... ---Edit.aspx
...---[Controler2]
.... |
.... ---hello.aspx
.... |
.... ---report.aspx
.---[Red]
...|
...---[Controler1]
.... |
.... ---index.aspx
.... |
.... ---Edit.aspx
...---[Controler2]
.... |
.... ---hello.aspx
.... |
.... ---report.aspx
但是如果用這種,預設的模板路徑是不支援的。
看了你的文章恍然大悟。
改一下ViewLocator的邏輯就可以了對吧。
[views]
.|
.---[Controler1]
...|
...---[blue]
.... |
.... ---index.aspx
.... |
.... ---Edit.aspx
...---[Red]
.... |
.... ---index.aspx
.... |
.... ---Edit.aspx
.---[Controler2]
...|
...---[blue]
.... |
.... ---hello.aspx
.... |
.... ---report.aspx
...---[Red]
.... |
.... ---hello.aspx
.... |
.... ---report.aspx
這樣,主題view無法獨立出來,不利於分離主題,管理主題。
而我覺得,最理想的結構是
[views]
.|
.---[blue]
...|
...---[Controler1]
.... |
.... ---index.aspx
.... |
.... ---Edit.aspx
...---[Controler2]
.... |
.... ---hello.aspx
.... |
.... ---report.aspx
.---[Red]
...|
...---[Controler1]
.... |
.... ---index.aspx
.... |
.... ---Edit.aspx
...---[Controler2]
.... |
.... ---hello.aspx
.... |
.... ---report.aspx
但是如果用這種,預設的模板路徑是不支援的。
看了你的文章恍然大悟。
改一下ViewLocator的邏輯就可以了對吧。
在這裡簡單給大家說下如何實現,只要給大家提供一點思路。其實把框架研究透徹了,真的很多問題都迎刃而解。
大家如果有看過我的上篇文章 ASP.NET MVC : 實現我們自己的檢視引擎 ,其實就明白的了。
在這裡,首先我們需要一個配置檔案來配置站點要使用的模板(主題)。
Config/Site.config :
xml version="1.0" encoding="utf-8"?> <site> <appsetting ViewTheme="Default" /> site>
然後修改預設的ViewLocator :
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public class uLinkViewLocator : ViewLocator
{
public uLinkViewLocator()
{
base.ViewLocationFormats = new string[] { BaseviewPath + "/{1}/{0}.aspx",
BaseviewPath + "/{1}/{0}.aspx",
BaseviewPath + "/Shared/{0}.aspx",
BaseviewPath + "/Shared/{0}.aspx",
"~/Views/{1}/{0}.aspx",
"~/Views/{1}/{0}.aspx",
"~/Views/Shared/{0}.aspx",
"~/Views/Shared/{0}.aspx"
};
}
private string _baseviewPath;
private string BaseviewPath
{
get
{
if (string.IsNullOrEmpty(_baseviewPath))
{
string viewTheme = ConfigXml.Element("appsetting").Attribute("ViewTheme").Value;
viewTheme = string.IsNullOrEmpty(viewTheme) ? "Default" : viewTheme;
_baseviewPath = "~/Views/" + viewTheme;
}
return _baseviewPath;
}
}
private XElement configXml;
private string path = System.Web.HttpRuntime.AppDomainAppPath + "/Config/Site.config";
/**////
/// 載入XML檔案
///
private XElement ConfigXml
{
get
{
if (configXml == null)
{
configXml = XElement.Load(path);
}
return configXml;
}
}
}
還有修改ViewEngine的ViewLocator 為剛才建立的uLinkViewLocator :
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public class uLinkViewEngine : WebFormViewEngine
{
IViewLocator _viewLocator = null;
protected override void RenderView(ViewContext viewContext)
{
base.ViewLocator = this.ViewLocator;
base.RenderView(viewContext);
}
public IViewLocator ViewLocator
{
get
{
if (this._viewLocator == null)
{
this._viewLocator = new uLinkViewLocator();
}
return this._viewLocator;
}
set
{
this._viewLocator = value;
}
}
}
然後建立一個ControllerFactory繼承自預設的DefaultControllerFactory,以修改預設的controller中的ViewEngine為我們建立的uLinkViewEngine :
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public class uLinkControllerFactory : DefaultControllerFactory
{
protected override IController CreateController(RequestContext requestContext, string controllerName)
{
Controller controller = (Controller)base.CreateController(requestContext, controllerName);
controller.ViewEngine = new uLinkViewEngine();//修改預設的檢視引擎為我們剛才建立的檢視引擎
return controller;
}
}
在Global.asax.cs中的Application_Start 事件中註冊我們的 uLinkControllerFactory :
ControllerBuilder.Current.SetControllerFactory(typeof(uLinkControllerFactory));
然後在寫一個設定模板的Controller:
ThemeController
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public class ThemeController : Controller
{
private XElement configXml;
private string path = System.Web.HttpRuntime.AppDomainAppPath + "/Config/Site.config";
/**////
/// 載入XML檔案
///
private XElement ConfigXml
{
get
{
if (configXml == null)
{
configXml = XElement.Load(path);
}
return configXml;
}
}
public ActionResult Index()
{
// Add action logic here
throw new NotImplementedException();
}
public ActionResult ChangeTheme(string id)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-406792/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mybatis 多資料來源動態切換MyBatis
- SSM(八)動態切換資料來源SSM
- Spring AOP動態切換資料來源Spring
- Spring 多資料來源 AOP 動態切換Spring
- echarts 主題動態切換Echarts
- spring-data-redis 動態切換資料來源SpringRedis
- Spring實現多資料來源動態切換Spring
- 【ASP.NET Core】動態對映MVC路由ASP.NETMVC路由
- ASP.NET:MVC模板化機制ASP.NETMVC
- jenkins動態切換環境Jenkins
- Part 10: 任務項新增、修改和切換狀態
- 基於AOP的動態資料來源切換(附原始碼)原始碼
- 專案要實現多資料來源動態切換,咋搞?
- vue切換元件基礎模板Vue元件
- AbstractRoutingDataSource 實現動態資料來源切換原理簡單分析
- Android 主題動態切換框架:PrismAndroid框架
- JS動態相簿--隨滑鼠所至切換封面圖JS
- 動態切換JDK8和JAVA17JDKJava
- CSS3 tab選項卡動態切換CSSS3
- ASP.NET 2.0中動態修改頁面標題ASP.NET
- Spring Boot MyBatis 動態資料來源切換、多資料來源,讀寫分離Spring BootMyBatis
- SpringBoot 這麼實現動態資料來源切換,就很絲滑!Spring Boot
- 30個類手寫Spring核心原理之動態資料來源切換Spring
- spring+atomikos+mybatis 多資料來源事務(動態切換)SpringMyBatis
- nacos實現對minio的動態版本切換
- win10修改輸入法切換方式 win10修改輸入法切換快捷鍵Win10
- 30個類手寫Spring核心原理之動態資料來源切換(8)Spring
- 使用ViewPager和TabLayout來實現滑動切換效果ViewpagerTabLayout
- ViewPager(通過反射修改viewpager切換速度)Viewpager反射
- 小程式元件-swipe多頁切換,並支援下拉重新整理,上拉載入,menu動態聯動切換元件
- Asp.Net MVC路由引數獲取、替換ASP.NETMVC路由
- vue 實現tab切換動態載入不同的元件Vue元件
- Android 動態佈局實現多主題切換Android
- web風格樣式動態切換並cookie記憶WebCookie
- keycloak~登入皮膚動態切換的嘗試
- 動態主席樹模板
- 模板 - 動態規劃動態規劃
- ASP.NET MVC動作過濾器ASP.NETMVC過濾器