ASP.NET MVC出来这么久了,心中却又很多的疑惑:为什么所有的View都要放在Views目录下? 为什么Shared文件夹下面的页面可以被共享? 为什么Page既可以是*.cshtml,也可以是*.aspx?

其实上面的几个问题归结起来都是视图引擎的功效。

在传统的ASP.NET中,可能还没有ViewEngine的概念。因为在Web From里面,实现Page实现了IHttpHanlder的接口,所以Page既是响应的处理类,也是视图的渲染类。在ASP.NET MVC中,视图的概念被抽象了出来,试图引擎的概念也被抽象成了一个接口。

首先来看一下IViewEngine接口的定义

 namespace System.Web.Mvc
{
public interface IViewEngine
{
ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache);
ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache);
void ReleaseView(ControllerContext controllerContext, IView view);
}
}

总共3个函数,总结起来大概就是两个功能:Find & Release。

默认情况下,ASP.NET MVC提供了两个视图引擎:WebFormViewEngine和RazorViewEngine

 namespace System.Web.Mvc
{
public static class ViewEngines
{
private static readonly ViewEngineCollection _engines = new ViewEngineCollection
{
new WebFormViewEngine(),
new RazorViewEngine(),
}; public static ViewEngineCollection Engines
{
get { return _engines; }
}
}
}

这就是为什么ASP.NET MVC既支持*.aspx,又支持*.cshtml的原因了(个人觉得如果已经确定要使用RazorView的话,不如把WebFormViewEngine给移除,可能对性能会有所帮助)。

那为什么所有的视图都要放在Views目录下呢,这个就要拜RazorViewngines所赐了。

下面是RazorViewEngine的构造函数:

         public RazorViewEngine(IViewPageActivator viewPageActivator)
: base(viewPageActivator)
{
AreaViewLocationFormats = new[]
{
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/{1}/{0}.vbhtml",
"~/Areas/{2}/Views/Shared/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.vbhtml"
};
AreaMasterLocationFormats = new[]
{
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/{1}/{0}.vbhtml",
"~/Areas/{2}/Views/Shared/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.vbhtml"
};
AreaPartialViewLocationFormats = new[]
{
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/{1}/{0}.vbhtml",
"~/Areas/{2}/Views/Shared/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.vbhtml"
}; ViewLocationFormats = new[]
{
"~/Views/{1}/{0}.cshtml",
"~/Views/{1}/{0}.vbhtml",
"~/Views/Shared/{0}.cshtml",
"~/Views/Shared/{0}.vbhtml"
};
MasterLocationFormats = new[]
{
"~/Views/{1}/{0}.cshtml",
"~/Views/{1}/{0}.vbhtml",
"~/Views/Shared/{0}.cshtml",
"~/Views/Shared/{0}.vbhtml"
};
PartialViewLocationFormats = new[]
{
"~/Views/{1}/{0}.cshtml",
"~/Views/{1}/{0}.vbhtml",
"~/Views/Shared/{0}.cshtml",
"~/Views/Shared/{0}.vbhtml"
}; FileExtensions = new[]
{
"cshtml",
"vbhtml",
};
}

所有的寻址路径都被格式化了,是不是很眼熟呢,关于这里为啥用数组而不用List,个人觉得,数组的寻址效率要更高些,遍历速度更快。

好了,找了“罪魁祸首”,就好好地调教一个,让它乖乖听话,小样让去哪就去哪里。

  /// <summary>
/// razor视图引擎扩展
/// </summary>
public class CustomerViewEngine : RazorViewEngine
{
/// <summary>
/// 可以分开部署不同语种
/// </summary>
/// <param name="engineName"></param>
public CustomerViewEngine(string engineName)
{
base.ViewLocationFormats = new[]
{
"~/Views" + engineName + "/{1}/{0}.cshtml",
"~/Views" + engineName + "/Shared/{0}.cshtml"
}; base.PartialViewLocationFormats = new[]
{
"~/Views" + engineName + "/{1}/{0}.cshtml",
"~/Views" + engineName + "/Shared/{0}.cshtml"
}; base.AreaViewLocationFormats = new[]
{
"~Areas/{2}/Views" + engineName + "/{1}/{0}.cshtml",
"~Areas/{2}/Views" + engineName + "/Shared/{0}.cshtml"
}; base.AreaPartialViewLocationFormats = new[]
{
"~Areas/{2}/Views" + engineName + "/{1}/{0}.cshtml",
"~Areas/{2}/Views" + engineName + "/Shared/{0}.cshtml"
};
} public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
this.SetEngine(controllerContext);
return base.FindView(controllerContext, viewName, masterName, useCache);
} public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
{
this.SetEngine(controllerContext);
return base.FindPartialView(controllerContext, partialViewName, useCache);
} /// <summary>
/// 根据条件自行设置,目前是chrome浏览器就展示默认的
/// 不是chrome浏览器的话就展示/Themes/Eleven下的
/// 可以直接测试是移动端还是pc端
/// 然后写入cookie
/// </summary>
private void SetEngine(ControllerContext controllerContext)
{
string engineName = "/Themes/Eleven";
if (controllerContext.HttpContext.Request.UserAgent.IndexOf("Chrome/65") >= )
{
engineName = null;
} //if (controllerContext.HttpContext.Request.IsMobile())//检测是不是移动端
//{
// engineName = null;
//} base.ViewLocationFormats = new[]
{
"~/Views" + engineName + "/{1}/{0}.cshtml",
"~/Views" + engineName + "/Shared/{0}.cshtml"
}; base.PartialViewLocationFormats = new[]
{
"~/Views" + engineName + "/{1}/{0}.cshtml",
"~/Views" + engineName + "/Shared/{0}.cshtml"
}; base.AreaViewLocationFormats = new[]
{
"~Areas/{2}/Views" + engineName + "/{1}/{0}.cshtml",
"~Areas/{2}/Views" + engineName + "/Shared/{0}.cshtml"
}; base.AreaPartialViewLocationFormats = new[]
{
"~Areas/{2}/Views" + engineName + "/{1}/{0}.cshtml",
"~Areas/{2}/Views" + engineName + "/Shared/{0}.cshtml"
};
}

接下去就很简单了,只需要把原来的视图引擎清空,加载自己的视图引擎就可以了

         protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new CustomViewEngine()); RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}

定制属于你自己的ViewEngine(一套逻辑多套UI)的更多相关文章

  1. 10套免费的 Photoshop UI 元素以及 PSD 素材

    免费的 PSD 用户界面工具包以及可以编辑 Photoshop PSD 文件,有你需要的设计漂亮的用户界面和惊人使用体验.这些用户界面工具包可有免费下载,可随意定制的,而且这些 PSD 分层素材文件组 ...

  2. 分享一套精美的现代 UI PSD 工具包【免费下载】

    艾库特·耶尔马兹,是土耳其伊斯坦布尔的一位高级艺术总监,他向大家分享了一套美丽的现代 UI 工具包,你可以免费下载.所以,你可以使用这个优秀的素材设计视觉互动和有吸引力的用户界面. 此 UI 套件提供 ...

  3. 免费素材:25套免费的 Web UI 设计的界面元素(转)

    Web 元素是任何网站相关项目都需要的,质量和良好设计的元素对于设计师来说就像宝贝一样.如果您正在为您的网站,博客,Web 应用程序或移动应用程序寻找完美设计的网页元素,那么下面这个列表会是你需要的. ...

  4. socket , 套接口还是套接字,傻傻分不清楚

    socket 做网络通信的朋友大都对socket这个词不会感到陌生,但是它的中文翻译是叫套接口还是套接字呢,未必大多数朋友能够分清,今天我们就来聊聊socket的中文名称. socket一词的起源 在 ...

  5. ASP.NET MVC - 定制属于你自己的ViewEngine

    http://blog.csdn.net/jackvs/article/details/7788743 ASP.NET MVC出来这么久了,心中却又很多的疑惑:为什么所有的View都要放在Views目 ...

  6. React 同构

    React 同构 搬运 https://segmentfault.com/a/1190000004671209 究竟什么是同构呢? 同构就是希望前端 后端都使用同一套逻辑 同一套代码 Nodejs出现 ...

  7. mvc架构和mvp架构

    mvc,mvp其实是复合模式,是多个设计模式的组合:将多个模式结合起来形成一个框架,已解决一般性问题. mvc: 既然mvc是复合模式,那么是由哪些设计模式组合的呢? 观察者设计模式:view和con ...

  8. 网购的一套UI代码的始末

    引言: 一个商业项目的需要,又因为时间紧迫的关系,准备购买一套简洁,易用,可定制化强的UI,经过对国内外多家UI产品进行了对比, 包括:FineUI, EasyUI, EXT.NET, EXTJS, ...

  9. Java快速开发平台,JEECG 3.7.7闪电版本发布,增加多套主流UI代码生成器模板

    JEECG 3.7.7 闪电版本发布,提供5套主流UI代码生成器模板 导读 ⊙平台性能优化,速度闪电般提升           ⊙提供5套新的主流UI代码生成器模板(Bootstrap表单+Boots ...

随机推荐

  1. 一、doT.js使用笔记

    一.赋值https://www.jianshu.com/p/19156f9fac1e <!DOCTYPE html> <html> <head> <meta ...

  2. 最简单的Android项目(添加jar文件)

    如果项目需要引用第三方jar文件,需要对编译命令做一些改动. 首先在项目根目录创建libs目录,将需要的jar文件拷贝到里面. 编译过程中有两步需要改动. 编译java源文件时,需要添加class p ...

  3. php正则替换非站内链接 替换zencart描述内的非本站链接

    php正则替换非站内链接 <?php //要替换的文本,比如产品描述中的文字 header("content-Type: text/html; charset=utf-8") ...

  4. P1058 立体图题解

    小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m \times nm×n的矩形区域,上面有m \times ...

  5. Mac 升级python2.7 到 3.5

      Mac 系统 OSX 10.12 以上 第1步:下载Python3.5 下载地址如下: Python3.5 第二步:安装python 3.50 点击下载好的pkg文件进行安装,安装完成之后,pyt ...

  6. oracle 创建表的规则

    1.表明首字母 应该为字母 2.表名的最大长度为30个字符 3.不能使用oracle保留字和关键字来作表名 4.同一用户下的不同表不能具有相同的名称 5.可以使用下划线.数字和字母,但不能使用空格与单 ...

  7. PS使用滤镜制作光晕效果

    滤镜制作光晕效果 新建图层,将背景色填充为黑色 滤镜->渲染->镜头光晕 调整好光晕大小 通过滤色(图层两字下面一点点的位置,有个下拉菜单,点开就在里面),去黑留白 如果觉得光线不够,可以 ...

  8. 按照行数分割excel

    本来是想通过NOPI自己编写个小工具分割excel的,但是不想去研究API,就百度了一下,找了很久,有几个软件说是为了这个功能而生,实际上要么不能使用,要么出错,所以暂时没有公开可用的软件. 然后我就 ...

  9. 通过源码安装PostgresSQL

    通过源码安装PostgresSQL 1.1 下载源码包环境: Centos6.8 64位 yum -y install bison flex readline-devel zlib-devel yum ...

  10. 为什么second是秒也是第二?

    起源 早期在西方,一小时分为 60 分钟.后来,科学发达了.文明进步了,人们认为一分钟太粗放了.必须划分得更细致,于是就把一分钟划分成 60 等分.由于是对时间的第二次划分,就将新的 60 等分的“单 ...