2012-07-26 14:17 5365人阅读 评论(0) 收藏 举报
 分类:
ASP.NET(12) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

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

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

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

  1. namespace System.Web.Mvc
  2. {
  3. public interface IViewEngine
  4. {
  5. ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache);
  6. ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache);
  7. void ReleaseView(ControllerContext controllerContext, IView view);
  8. }
  9. }
 

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

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

  1. namespace System.Web.Mvc
  2. {
  3. public static class ViewEngines
  4. {
  5. private static readonly ViewEngineCollection _engines = new ViewEngineCollection
  6. {
  7. new WebFormViewEngine(),
  8. new RazorViewEngine(),
  9. };
  10. public static ViewEngineCollection Engines
  11. {
  12. get { return _engines; }
  13. }
  14. }
  15. }

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

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

下面是RazorViewEngine的构造函数:

  1. public RazorViewEngine(IViewPageActivator viewPageActivator)
  2. : base(viewPageActivator)
  3. {
  4. AreaViewLocationFormats = new[]
  5. {
  6. "~/Areas/{2}/Views/{1}/{0}.cshtml",
  7. "~/Areas/{2}/Views/{1}/{0}.vbhtml",
  8. "~/Areas/{2}/Views/Shared/{0}.cshtml",
  9. "~/Areas/{2}/Views/Shared/{0}.vbhtml"
  10. };
  11. AreaMasterLocationFormats = new[]
  12. {
  13. "~/Areas/{2}/Views/{1}/{0}.cshtml",
  14. "~/Areas/{2}/Views/{1}/{0}.vbhtml",
  15. "~/Areas/{2}/Views/Shared/{0}.cshtml",
  16. "~/Areas/{2}/Views/Shared/{0}.vbhtml"
  17. };
  18. AreaPartialViewLocationFormats = new[]
  19. {
  20. "~/Areas/{2}/Views/{1}/{0}.cshtml",
  21. "~/Areas/{2}/Views/{1}/{0}.vbhtml",
  22. "~/Areas/{2}/Views/Shared/{0}.cshtml",
  23. "~/Areas/{2}/Views/Shared/{0}.vbhtml"
  24. };
  25. ViewLocationFormats = new[]
  26. {
  27. "~/Views/{1}/{0}.cshtml",
  28. "~/Views/{1}/{0}.vbhtml",
  29. "~/Views/Shared/{0}.cshtml",
  30. "~/Views/Shared/{0}.vbhtml"
  31. };
  32. MasterLocationFormats = new[]
  33. {
  34. "~/Views/{1}/{0}.cshtml",
  35. "~/Views/{1}/{0}.vbhtml",
  36. "~/Views/Shared/{0}.cshtml",
  37. "~/Views/Shared/{0}.vbhtml"
  38. };
  39. PartialViewLocationFormats = new[]
  40. {
  41. "~/Views/{1}/{0}.cshtml",
  42. "~/Views/{1}/{0}.vbhtml",
  43. "~/Views/Shared/{0}.cshtml",
  44. "~/Views/Shared/{0}.vbhtml"
  45. };
  46. FileExtensions = new[]
  47. {
  48. "cshtml",
  49. "vbhtml",
  50. };
  51. }

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

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

  1. namespace MvcApplicatin.Web.Mvc.ViewEngine
  2. {
  3. public sealed class CustomViewEngine : RazorViewEngine
  4. {
  5. public CustomViewEngine()
  6. {
  7. ViewLocationFormats = new[]
  8. {
  9. "~/Views/{1}/{0}.cshtml",
  10. "~/Views/Shared/{0}.cshtml",
  11. "~/CustomViewLocation/{1}/{0}.cshtml"
  12. };
  13. }
  14. public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
  15. {
  16. return base.FindView(controllerContext, viewName, masterName, useCache);
  17. }
  18. }
  19. }

我使用开发语言是C#,视图是Razor,所以稍稍修改了下ViewLocationFormats,让寻址路径能够寻到CustomViewLocation下面的视图。

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

  1. protected void Application_Start()
  2. {
  3. AreaRegistration.RegisterAllAreas();
  4. ViewEngines.Engines.Clear();
  5. ViewEngines.Engines.Add(new CustomViewEngine());
  6. RegisterGlobalFilters(GlobalFilters.Filters);
  7. RegisterRoutes(RouteTable.Routes);
  8. }

asp.net mvc 多级文件夹的更多相关文章

  1. MVC图片上传、浏览、删除 ASP.NET MVC之文件上传【一】(八) ASP.NET MVC 图片上传到服务器

    MVC图片上传.浏览.删除   1.存储配置信息 在web.config中,添加配置信息节点 <appSettings> <add key="UploadPath" ...

  2. Java基础知识强化之IO流笔记50:IO流练习之 复制多级文件夹的案例

    1. 复制多级文件夹的案例 需求:复制多级文件夹       数据源:E:\JavaSE\day21\code\demos     目的地:E:\   分析:         A:封装数据源File ...

  3. Asp.net mvc 大文件上传 断点续传

    Asp.net mvc 大文件上传 断点续传 进度条   概述 项目中需要一个上传200M-500M的文件大小的功能,需要断点续传.上传性能稳定.突破asp.net上传限制.一开始看到51CTO上的这 ...

  4. 用Java实现将多级文件夹下的所有文件统一放到一个文件夹中

    每次下了电影(男生懂得呦),每部电影都放在一个单独的文件夹里,看的时候很是不方便啊,一直重复着进入文件夹.后退,再进.再退的操作,而手动把这些电影全部复制出来又太繁琐.因此为了解决这个问题,用IO写了 ...

  5. bat如何创建多级文件夹(在android设备中)

    在android设备中要创建多个或者多级文件夹时,手动去创建费时费力(有点傻),一个bat文件就能很好的实现这个功能. 1.首先创建同级多个文件夹且在该文件夹下生成一个文件 @echo off ech ...

  6. java中递归实现复制多级文件夹

    常见的流的用法 递归实现复制多级文件夹 FileInputStream & FileOutputStream String content = null;//用来储存解码后的byte数组 in ...

  7. Eclipse 批量创建多级文件夹

      Eclipse 批量创建多级文件夹 CreateTime--2018年3月8日08:23:24 Author:Marydon 1.选中要建立文件夹的父级目录-->右键-->New--& ...

  8. ZIP解压缩文件的工具类【支持多级文件夹|全】

    ZIP解压缩文件的工具类[支持多级文件夹|全] 作者:Vashon 网上有非常多的加压缩演示样例代码.可是都仅仅是支持一级文件夹的操作.假设存在多级文件夹的话就不行了. 本解压缩工具类经过多次检查及重 ...

  9. IO流案例:1.复制多级文件夹 2.删除多级文件夹

    package copy; /* 需求:复制多级文件夹 复制d:\\itcast(包含文件和子文件夹)到模块目录下 分析: d:\\itcast a.txt b.txt javaweb a.xml b ...

随机推荐

  1. 吉特仓库管理系统-ORM框架的使用

    最近在园子里面连续看到几篇关于ORM的文章,其中有两个印象比较深刻<<SqliteSugar>>,另外一篇文章是<<我的开发框架之ORM框架>>, 第一 ...

  2. VPN使用指南|稳定的VPN|

    之前一直用GoagentFQ,但是有时不太稳定,网速也不是很快,然后就试用了云梯VPN,感觉还不错,网速挺快,也比较稳定.http://opticalvpn.com/?r=72ec52481ab8d2 ...

  3. Codeforces Canda Cup 2016

    A.B:模拟 C.构造下就行了 D.题意:n个参加ACM的队(n<=300000),每个队都有自己的初始气球数和重量,规定如果气球数>重量,那么此队就会飞起来,淘汰出局,你现在是第一组,你 ...

  4. 【jQuery api】 $.type(obj)

    用来获取JavaScript数据类型[[Class]]的对象 <!DOCTYPE html> <html> <head> <script src=" ...

  5. sql where and or优先级 待验证

    where 后面如果有and,or的条件,则or自动会把左右的查询条件分开,即先执行and,再执行or.原因就是:and的执行优先级最高! 关系型运算符优先级高到低为:not and or 问题的解决 ...

  6. 关于SQL中的排序问题

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguratio ...

  7. 【UOJ #13】【UER #1】跳蚤OS

    http://uoj.ac/problem/13 建立trie树,然后建立go指针, 和AC自动机里的fail指针差不多, 走到一个快捷方式就从go指针走. 注意在trie树上要保留字符'/',不能用 ...

  8. jQuery 选择同时包含两个class的元素的实现方法

    Jquery选择器 多个 class属性参照以下案例 <element class="a b good list card"> 1. 交集选择: $(".a. ...

  9. Log4net中换行符

    在log4net节点中 <appender name="DebugLogFileAppender" type="log4net.Appender.FileAppen ...

  10. python取mysql数据写入excel

    环境:MySQLdb openpyxl模块 python去zabbix的mysql数据库中取交换机不同时间段的进出口流量,然后写入excel中,每天cron执行,每周四邮件发送.(代码中第一行必须加上 ...