asp.net mvc 多级文件夹

版权声明:本文为博主原创文章,未经博主允许不得转载。
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,个人觉得,数组的寻址效率要更高些,遍历速度更快。
好了,找了“罪魁祸首”,就好好地调教一个,让它乖乖听话,小样让去哪就去哪里。
- namespace MvcApplicatin.Web.Mvc.ViewEngine
- {
- public sealed class CustomViewEngine : RazorViewEngine
- {
- public CustomViewEngine()
- {
- ViewLocationFormats = new[]
- {
- "~/Views/{1}/{0}.cshtml",
- "~/Views/Shared/{0}.cshtml",
- "~/CustomViewLocation/{1}/{0}.cshtml"
- };
- }
- public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
- {
- return base.FindView(controllerContext, viewName, masterName, useCache);
- }
- }
- }

我使用开发语言是C#,视图是Razor,所以稍稍修改了下ViewLocationFormats,让寻址路径能够寻到CustomViewLocation下面的视图。
接下去就很简单了,只需要把原来的视图引擎清空,加载自己的视图引擎就可以了。
- protected void Application_Start()
- {
- AreaRegistration.RegisterAllAreas();
- ViewEngines.Engines.Clear();
- ViewEngines.Engines.Add(new CustomViewEngine());
- RegisterGlobalFilters(GlobalFilters.Filters);
- RegisterRoutes(RouteTable.Routes);
- }
asp.net mvc 多级文件夹的更多相关文章
- MVC图片上传、浏览、删除 ASP.NET MVC之文件上传【一】(八) ASP.NET MVC 图片上传到服务器
MVC图片上传.浏览.删除 1.存储配置信息 在web.config中,添加配置信息节点 <appSettings> <add key="UploadPath" ...
- Java基础知识强化之IO流笔记50:IO流练习之 复制多级文件夹的案例
1. 复制多级文件夹的案例 需求:复制多级文件夹 数据源:E:\JavaSE\day21\code\demos 目的地:E:\ 分析: A:封装数据源File ...
- Asp.net mvc 大文件上传 断点续传
Asp.net mvc 大文件上传 断点续传 进度条 概述 项目中需要一个上传200M-500M的文件大小的功能,需要断点续传.上传性能稳定.突破asp.net上传限制.一开始看到51CTO上的这 ...
- 用Java实现将多级文件夹下的所有文件统一放到一个文件夹中
每次下了电影(男生懂得呦),每部电影都放在一个单独的文件夹里,看的时候很是不方便啊,一直重复着进入文件夹.后退,再进.再退的操作,而手动把这些电影全部复制出来又太繁琐.因此为了解决这个问题,用IO写了 ...
- bat如何创建多级文件夹(在android设备中)
在android设备中要创建多个或者多级文件夹时,手动去创建费时费力(有点傻),一个bat文件就能很好的实现这个功能. 1.首先创建同级多个文件夹且在该文件夹下生成一个文件 @echo off ech ...
- java中递归实现复制多级文件夹
常见的流的用法 递归实现复制多级文件夹 FileInputStream & FileOutputStream String content = null;//用来储存解码后的byte数组 in ...
- Eclipse 批量创建多级文件夹
Eclipse 批量创建多级文件夹 CreateTime--2018年3月8日08:23:24 Author:Marydon 1.选中要建立文件夹的父级目录-->右键-->New--& ...
- ZIP解压缩文件的工具类【支持多级文件夹|全】
ZIP解压缩文件的工具类[支持多级文件夹|全] 作者:Vashon 网上有非常多的加压缩演示样例代码.可是都仅仅是支持一级文件夹的操作.假设存在多级文件夹的话就不行了. 本解压缩工具类经过多次检查及重 ...
- IO流案例:1.复制多级文件夹 2.删除多级文件夹
package copy; /* 需求:复制多级文件夹 复制d:\\itcast(包含文件和子文件夹)到模块目录下 分析: d:\\itcast a.txt b.txt javaweb a.xml b ...
随机推荐
- ElasticSearch第一步-环境配置
ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticSearch第四步-查询详解 Elasti ...
- 【jQuery】$.ajax() 常用参数理解
参考:http://hemin.cn/jq/jQuery.ajax.html注意,所有的选项都可以通过$.ajaxSetup()函数来全局设置.个人理解全局设置,在每次调用$.ajax()时都会执行 ...
- React.js常识
1.React的特点: 简单.声明式-自动dom操作. React核心:组件,组件的设计目的:提高代码复用率,降低测试难度和代码复杂度. 提高代码复用率:组建将数据和逻辑进行封装,类似面向对象的类: ...
- Redis java操作客户端
Jedis常用操作 1.测试连通性 Jedis jedis = new Jedis("192.168.1.201",6380,10000); System.out.println( ...
- IE8的parseInt
踩到一个IE8的parseInt的坑: Chrome:
- JavaScript错误之:Uncaught ReferenceError: $ is not defined
在js开发中,很多人遇到类似问题,都找不到解决方法.Uncaught ReferenceError: $ is not defined,在这里给大家提供几个解决方法. 方法/步骤11.出现这个错误,最 ...
- 常见linux命令释义(第九天)—— Bash Shell 的操作环境Shell 中的管道命令一些管道命令
最近好懒好懒.连写文章都写不好了.于是只能写读一点书,记一点读书笔记了.太懒了,没办法.慢慢恢复自己的状态吧. 管道命令仅会处理strandard output 的内容,对于strandard err ...
- myBatis foreach详解【转】
MyBatis的foreach语句详解 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有 item,index,collection,ope ...
- Join Attributes
1. IWorkspaceFactory2 workspaceFactory = new ShapefileWorkspaceFactoryClass() as IWorkspaceFactory2; ...
- 第二轮冲刺-Runner站立会议09
今天:将日历界面和主程序结合起来 明天:查看整个项目,调试是否有问题