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机制的更多相关文章

  1. ASP.NET MVC扩展自定义视图引擎支持多模板&动态换肤skins机制

    ASP.NET mvc的razor视图引擎是一个非常好的.NET MVC框架内置的视图引擎.一般情况我们使用.NET MVC框架为我们提供的这个Razor视图引擎就足够了.但是有时我们想在我们的项目支 ...

  2. ASP.NET MVC 3 Razor 视图引擎 基本语法

    本篇博文将进入MVC 3 的世界了,首先学习一下MVC 3 新增的Razor视图引擎的基本语法. 1. 使用 @ 字符将代码添加到页面中.正如传统的aspx视图的<% %>相同.      ...

  3. ASP.NET MVC自定义视图引擎ViewEngine 创建Model的专属视图

    MVC内置的视图引擎有WebForm view engine和Razor view engine,当然也可以自定义视图引擎ViewEngine. 本文想针对某个Model,自定义该Model的专属视图 ...

  4. (翻译)为你的MVC应用程序创建自定义视图引擎

    Creating your own MVC View Engine For MVC Application 原文链接:http://www.codeproject.com/Articles/29429 ...

  5. 自定义视图引擎,实现MVC主题快速切换

    一个网站的主题包括布局,色调,内容展示等,每种主题在某些方面应该或多或少不一样的,否则就不能称之为不同的主题了.每一个网站至少都有一个主题,我这里称之为默认主题,也就是我们平常开发设计网站时的一个固定 ...

  6. ASP.NET MVC 4 (五) 视图

    视图引擎与视图 多数情况下控制器action方法返回ViewResult对象,MVC内建action调用器ControllerActionInvoker负责调用控制器action方法并调用视图引擎处理 ...

  7. BrnShop开源网上商城第五讲:自定义视图引擎

    今天这篇博文主要讲解自定义视图引擎,大家都知道在asp.net mvc框架中默认自带一个Razor视图引擎,除此之外我们也可以自定义自己的视图引擎,只需要实现IViewEngine接口,接口定义如下: ...

  8. ASP.NET MVC学习之视图篇(1)

    一.前言 不知道还有多少读者从第一篇开始一直学习到如今,笔者也会一直坚持将ASP.NET MVC的学习完美的结束掉,然后开始写如何配合其他框架使用ASP.NET MVC的随笔.当然笔者后面的随笔如果没 ...

  9. ASP.NET MVC扩展库

    很多同学都读过这篇文章吧 ASP.NET MVC中你必须知道的13个扩展点,今天给大家介绍一个ASP.NET MVC的扩展库,主要就是针对这些扩展点进行.这个项目的核心是IOC容器,包括Ninject ...

随机推荐

  1. bzoj 4292: [PA2015]Równanie

    Description 对于一个正整数n,定义f(n)为它十进制下每一位数字的平方的和.现在给定三个正整数k,a,b,请求出满足a<=n<=b且k*f(n)=n的n的个数.   Input ...

  2. Windows系统——后缀为.zip.00X的zip分卷解压

    Windows下后缀为*.zip.001文件的解压方法: 后缀为*.zip.001文件用winrar无法解压, 解决办法是在windows下打开命令行界面, 输入:copy /B xx.zip.001 ...

  3. 在子页面session过期无法跳转到父页面

    当session过期后可以用过滤器来设置重定向页面 public class ActionFilter extends HttpServlet implements Filter { private ...

  4. Chrome 浏览器访问 Google 学术出现问题 “but your computer or network may be sending automated queries. ”

    问题: Chrome 浏览器访问 Google 学术出现如下的问题 : ... but your computer or network may be sending automated querie ...

  5. vue.js单文件组件中非父子组件的传值

    最近在研究vue.js,总体来说还算可以,但是在web开发群里有一些人问在单文件组件开发模式中非父子组件如何传值的问题,今天在这里讲讲,希望对大家有所帮助! 在官网api中的这段讲解很少,也很模糊:官 ...

  6. 美食节(bzoj 2879)

    Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...

  7. pat 甲级 1127. ZigZagging on a Tree (30)

    1127. ZigZagging on a Tree (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...

  8. 《手把手教你学C语言》学习笔记(6)---数据类型和常量

    计算机中需要保存信息,就需要数据存储,数据的存储就需要划分数据类型.主要包括:基本数据类型.指针类型.构造类型.空类型. 基本类型:整型---主要用来表示整数,可以分为无符号和有符号:又分为基本整型. ...

  9. 迷宫问题(DFS,BFS)

    /******************************** 啊哈!算法 深度优先搜索算法 迷宫问题 输入: 5 4 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 ...

  10. Codeforces Round #449 (Div. 2) B. Chtholly's request【偶数位回文数】

    B. Chtholly's request time limit per test 2 seconds memory limit per test 256 megabytes input standa ...