ASP.NET MVC 扩展自定义视图引擎支持多模板&动态换肤skins机制
ASP.NET mvc的razor视图引擎是一个非常好的.NET MVC 框架内置的视图引擎。一般情况我们使用.NET MVC框架为我们提供的这个Razor视图引擎就足够了。但是有时我们想在我们的
项目支持多模板&skins机制,比如我们可能会有多套的模板,也就是多个View风格,而我们只需要改一下配置文件就可以轻松的改变页面的风格和模板。实现这个功能有两种方式:
一:使用接口ViewEngine自己完成一个类似Razor视图引擎的功能
二、继承类RazorViewEngine类,重写它的一些方法达到自定义视图引擎的目的
显然方法二是最简单的,因此我们选最简单方式实现这个功能
1、首先,我们定义一个一些基础的辅助类
标示支持Skin特性类:
using System;
///用于标示支持Skin换肤的特性
public class SupportSkinAttribute:Attribute
{
}
风格配置结点读取类:
using System;
using System.Configuration;
using system.Web;
public class Utils
{
private static string _skinName;
public static string SkinName{
get{
if(!string.IsNullOrEmpty(_skinName))
{
return _skinName;}
//模板风格
_skinName=ConfigurationManager.AppSettings["Skin"];
return _skinName;
}
}
}
Helper类:
public class CustomViewEngineHelper
{
internal static string[] AddNewLocationFormats(IEnumerable<string> defaultLocationFormats,IEnumerable<string>
newLocationFormats)
{
List<string>allItems=new List<string>(newLocationFormats);
foreach(string s in defaultLocationFormats)
{
allItems.Add(s);
}
return allItems.ToArray();
}
internal static string OverrideMasterPage(string masterName,ControllerContext controllerContext)
{
if(NeedChangeMasterPage(controllerContext))
{
masterName=Utils.SkinName;
}
return masterName;
}
private static bool NeedChangeMasterPage(ControllerContext context)
{
SupportSkinAttribute attr=Attribute.GetCustomAttribute(context.Controller.GetType(),typeof(SupportSkinAttribute)) as SupportSkinAttribute;
return null !=attr;
}
}
2、然后,定义CustomRazorViewEngine类
CustomRazorVieEngine.cs:
public class CustomRazorViewEngine:RazorViewEngine
{
public CustomRazorViewEngine()
{
string[] mastersLocation=new[]{string.Format("~/skins/{0}/views/{0}.cshtml",Utils.SkinName}};
//视图文件位置路径的格式
ViewLocationFormats=PartialViewLocationFormats=CustomViewEngineHelper.AddNewLocationFormats(new List<string>(ViewLocationFormats),viewsLocation);}
//查找视图文件
public override ViewEngineResult FindView(ControllerContext controllerContext,string viewName,string masterName,bool useCache)
{
masterName=CustomViewEngineHelper.OverrideMasterPage(masterName,controllerContext);
return base.FindView(controllerContext,viewName,masterName,useCache);
}
}
上面代码是最核心的部分,我们在CustomRazorViewEngine类构造函数中就按照我们自定约定规则重写了MasterLocationFormats(~/skins/{0}/views/{0}.cshtml)和
ViewLocationFormats(~/skins/{0}/Views/{{1}}/{{0}}.cshtml)属性,最后在FindView方法中重写了master的文件名
如果风格名为lanhu,将按照以下的规则来创建视图文件:
1、MasterLocationFormats(Layout)路径为:~/skins/lanhu/views/lanhu.cshtml
2.ViewLocationFormats(视图文件)路径为:~/skins/lanhu/Views/{1}/{0}.cshtml,其中{1}和{0}分别表示Controller和Action的名字
3、最后,注册CustomRazorViewEngine
最后,在Application_Start中加入下面的代码,使用CustomRazorViewEngine生效
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new CustomRazorViewEngine());
上面第一行是清除默认的视图引擎,接下来把我们自定义的CustomRazorViewEngine注册到MVC框架中使用其生效
使用CustomRazorViewEngine提供的多模板&skins换肤机制,要在Controller类前面加上特性SupportSkin,如下代码:
[SupportSkin]
public class HomeController
{
}
这样ASP.NET MVC 视图引擎就支持多模板&skins换肤机制了,我们只需要增加一个风格,在Skins文件夹中 创建自己的风格的文件夹,并添加相应的视图,最后,
在把Web.config的配置结点名为Skin的值改成,相应的风格名称(即skins文件夹的文件夹名)
ASP.NET MVC 扩展自定义视图引擎支持多模板&动态换肤skins机制的更多相关文章
- ASP.NET MVC扩展自定义视图引擎支持多模板&动态换肤skins机制
ASP.NET mvc的razor视图引擎是一个非常好的.NET MVC框架内置的视图引擎.一般情况我们使用.NET MVC框架为我们提供的这个Razor视图引擎就足够了.但是有时我们想在我们的项目支 ...
- ASP.NET MVC 3 Razor 视图引擎 基本语法
本篇博文将进入MVC 3 的世界了,首先学习一下MVC 3 新增的Razor视图引擎的基本语法. 1. 使用 @ 字符将代码添加到页面中.正如传统的aspx视图的<% %>相同. ...
- ASP.NET MVC自定义视图引擎ViewEngine 创建Model的专属视图
MVC内置的视图引擎有WebForm view engine和Razor view engine,当然也可以自定义视图引擎ViewEngine. 本文想针对某个Model,自定义该Model的专属视图 ...
- (翻译)为你的MVC应用程序创建自定义视图引擎
Creating your own MVC View Engine For MVC Application 原文链接:http://www.codeproject.com/Articles/29429 ...
- 自定义视图引擎,实现MVC主题快速切换
一个网站的主题包括布局,色调,内容展示等,每种主题在某些方面应该或多或少不一样的,否则就不能称之为不同的主题了.每一个网站至少都有一个主题,我这里称之为默认主题,也就是我们平常开发设计网站时的一个固定 ...
- ASP.NET MVC 4 (五) 视图
视图引擎与视图 多数情况下控制器action方法返回ViewResult对象,MVC内建action调用器ControllerActionInvoker负责调用控制器action方法并调用视图引擎处理 ...
- BrnShop开源网上商城第五讲:自定义视图引擎
今天这篇博文主要讲解自定义视图引擎,大家都知道在asp.net mvc框架中默认自带一个Razor视图引擎,除此之外我们也可以自定义自己的视图引擎,只需要实现IViewEngine接口,接口定义如下: ...
- ASP.NET MVC学习之视图篇(1)
一.前言 不知道还有多少读者从第一篇开始一直学习到如今,笔者也会一直坚持将ASP.NET MVC的学习完美的结束掉,然后开始写如何配合其他框架使用ASP.NET MVC的随笔.当然笔者后面的随笔如果没 ...
- ASP.NET MVC扩展库
很多同学都读过这篇文章吧 ASP.NET MVC中你必须知道的13个扩展点,今天给大家介绍一个ASP.NET MVC的扩展库,主要就是针对这些扩展点进行.这个项目的核心是IOC容器,包括Ninject ...
随机推荐
- HDU 3853 LOOPS 概率DP入门
LOOPS Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)Total Sub ...
- 5种你未必知道的JS和CSS交互的方法
随着浏览器不断的升级改进,CSS和JavaScript之间的界限越来越模糊.本来它们是负责着完全不同的功能,但最终,它们都属于网页前端技术,它们需要相互密切的合作.我们的网页中都有.js文件和.css ...
- [LeetCode] String to Integer (atoi) 字符串
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
- luogu 1258 小车问题 小学奥数(?)
题目链接 题意 甲.乙两人同时从A地出发要尽快同时赶到B地.出发时A地有一辆小车,可是这辆小车除了驾驶员外只能带一人.已知甲.乙两人的步行速度一样,且小于车的速度.问:怎样利用小车才能使两人尽快同时到 ...
- 【原创】Javascript-获取URL请求参数
function getUrlParam() { var param = [], hash; var url = window.location.href;//获取网页的url var hashes ...
- n!在k进制下的后缀0
问n! 转化成k进制后的位数和尾数的0的个数.[UVA 10061 How many zeros and how many digits?] Given a decimal integer numbe ...
- 这一次,我连 web.xml 都不要了,纯 Java 搭建 SSM 环境!
在 Spring Boot 项目中,正常来说是不存在 XML 配置,这是因为 Spring Boot 不推荐使用 XML ,注意,并非不支持,Spring Boot 推荐开发者使用 Java 配置来搭 ...
- Java I/O系统学习系列一:File和RandomAccessFile
I/O系统即输入/输出系统,对于一门程序语言来说,创建一个好的输入/输出系统并非易事.因为不仅存在各种I/O源端和想要与之通信的接收端(文件.控制台.网络链接等),而且还需要支持多种不同方式的通信(顺 ...
- Unity工程资源破解
Unity工程资源提取其实还是很方便的,网上也有很多相关介绍,比如雨凇就专门写了一遍关于破解Unity资源的文章(http://www.xuanyusong.com/archives/3618 ...
- 参数化1--jmeter参数化数据(_csvread函数、用户自定义变量等)
以下是转载内容,仔细看过后,觉得用得最多的应该是csvread函数.用户自定义变量以及CSV DATA CONFIG控制器这几个,但是做练习之后,在结果树和聚合报告中怎么查看执行结果是个问题,没找到对 ...