(一) 目录结构

  

  看到上面的目录结构 会有耳目一新的感觉,终于突破了原有的MVC目录结构。该目录结构除了使用原有的Controllers 文件夹之外,我们还使用了Games自定义文件夹中的Controllers。在Users文件夹中也同样还有一个Controllers文件夹,这些文件夹都是存放控制器类的。我们可以根据自己的需要建立不同的Controller 组。

  在大型项目开发的过程中,模块的数量可能会很多,仅仅只靠原有的目录结构是不能满足我们的要求的,而且扩展性也不是太好,因为思想就被束缚在它本身的结构上,扩展谈何容易。但真正的作为一个企业级架构这肯定是不行的,最起码走起来比较困难。于是控制器组,个性化的目录就是解决方案的开始。

(二) 扩展路由配置(RouteCollection 类的扩展)

  我们都知道 .net3.0 3.5 中出现的扩展方法使.net 出现了新的生机,我们不必在为系统方法的不适用而烦恼,也不用为其思维的束缚的叫苦不迭。扩展方法能使我们能够扩展系统中的任何一个类,给它重新添加自己想要的方法。

Code
 1 public class Student
 2     {
 3         private int _id;
 4 
 5         public int Id
 6         {
 7             get { return _id; }
 8             set { _id = value; }
 9         }
10 
11         private string _name;
12 
13         public string Name
14         {
15             get { return _name; }
16             set { _name = value; }
17         }
18     }

  我定义一个实体类,这个类中只有两个属相,没有任何自定方法。现在我们用扩展方法给Student添加一个Write()自定义方法

1 public static class StudentExtension
2     {
3         public static void Write(this Student stu, string name)
4         {
5             Console.WriteLine(name);
6         }
7     }

扩展方法的使用代码:

Code
 1  public class Test
 2     {
 3         public void Show()
 4         {
 5             Student stu = new Student();
 6             stu.Id = 1;
 7             stu.Name = "ddd";
 8             stu.Write(stu.Name);
 9         }
10     }

  注意 扩展方法必须在静态类中,而且扩展方法也必须用static修饰。扩展方法的第一个参数用this修饰,参考上面的就可以知道,当我们使用这个扩展方法的时候 参数就static 修饰方法中的非this修饰的参数,说的有点绕口。相信能够明白。

  RouteCollection扩展类,扩展路由设置

 1 public static class AreaRouteHelper
 2     {
 3         public static void CreateArea(this RouteCollection routes, 
 4             string areaName, 
 5             string controllerNameSpace, 
 6             params Route[] routeEntries)
 7         {
 8             foreach (Route route in routeEntries)
 9             {
10                 if (route.Constraints == null)
11                 {
12                     route.Constraints = new RouteValueDictionary();
13                 }
14 
15                 if (route.Defaults == null)
16                 {
17                     route.Defaults = new RouteValueDictionary();
18                 }
19 
20                 if (route.DataTokens == null)
21                 {
22                     route.DataTokens = new RouteValueDictionary();
23                 }
24 
25                 route.Constraints.Add("area",areaName);
26                 route.Defaults.Add("area",areaName);
27                 route.DataTokens.Add("namespaces",new string[]{controllerNameSpace});
28 
29                 if (!routes.Contains(route))
30                 {
31                     routes.Add(route);
32                 }
33             }
34         }
35     }

  

  对于自定义视图的关键还是如下:WebFormViewEngine 定义了视图文件的显示,我们可以继承改类从而重载覆盖父类的方法达到自己定义文件映射路径的目的

  

  1 public class AreaViewEngine:WebFormViewEngine
  2     {
  3         public AreaViewEngine()
  4             : base()
  5         {
  6             //定义页面文件或者用户控件文件的路径规则
  7             ViewLocationFormats = new string[] { 
  8                 "~/{0}.aspx",
  9                 "~/{0}.ascx",
 10                 "~/Views/{1}/{0}.aspx",
 11                 "~/Views/{1}/{0}.ascx",
 12                 "~/Views/Shared/{0}.aspx",
 13                 "~/Views/Shared/{0}.ascx"
 14             };
 15 
 16             //第一母版页文件路径规则
 17             MasterLocationFormats = new string[] { 
 18                 "~/{0}.master",
 19                 "~/Shared/{0}.master",
 20                 "~/Views/Shared/{0}.master",
 21                 "~/Views{1}/{0}.master"
 22             };
 23 
 24             PartialViewLocationFormats = ViewLocationFormats;
 25         }
 26 
 27 
 28         /// <summary>
 29         /// 匹配页面文件的,寻找相应的部分视图文件
 30         /// </summary>
 31         /// <param name="controllerContext"></param>
 32         /// <param name="partialViewName"></param>
 33         /// <param name="useCache"></param>
 34         /// <returns></returns>
 35         public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
 36         {
 37             ViewEngineResult viewResult = null;
 38             if (controllerContext.RequestContext.RouteData.Values.ContainsKey("area"))
 39             {
 40                 string areaPartialName = FormatViewName(controllerContext,partialViewName);
 41                 viewResult = base.FindPartialView(controllerContext,areaPartialName,useCache);
 42                 if (viewResult != null && viewResult.View != null)
 43                 {
 44                     return viewResult;
 45                 }
 46 
 47                 string sharedAreaPartialName = FormatPartialViewName(controllerContext, partialViewName);
 48                 viewResult = base.FindPartialView(controllerContext,sharedAreaPartialName,useCache);
 49                 if (viewResult != null && viewResult.View != null)
 50                 {
 51                     return viewResult;
 52                 }
 53             }
 54             return base.FindPartialView(controllerContext, partialViewName, useCache);
 55         }
 56 
 57         /// <summary>
 58         /// 匹配页面文件的,寻找相应的试图文件
 59         /// </summary>
 60         /// <param name="controllerContext"></param>
 61         /// <param name="viewName"></param>
 62         /// <param name="masterName"></param>
 63         /// <param name="useCache"></param>
 64         /// <returns></returns>
 65         public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
 66         {
 67             ViewEngineResult viewResult = null;
 68             if (controllerContext.RequestContext.RouteData.Values.ContainsKey("area"))
 69             {
 70                 string areaPartialName = FormatViewName(controllerContext, viewName);
 71                 viewResult = base.FindView(controllerContext, areaPartialName,masterName, useCache);
 72                 if (viewResult != null && viewResult.View != null)
 73                 {
 74                     return viewResult;
 75                 }
 76 
 77                 string sharedAreaPartialName = FormatPartialViewName(controllerContext, viewName);
 78                 viewResult = base.FindView(controllerContext, sharedAreaPartialName,masterName, useCache);
 79                 if (viewResult != null && viewResult.View != null)
 80                 {
 81                     return viewResult;
 82                 }
 83             }
 84             return base.FindView(controllerContext, viewName, masterName, useCache);
 85         }
 86 
 87         /// <summary>
 88         /// 这个匹配一般的页面文件或用户控件路径
 89         /// </summary>
 90         /// <param name="context"></param>
 91         /// <param name="viewName"></param>
 92         /// <returns></returns>
 93         public string FormatViewName(ControllerContext context, string viewName)
 94         {
 95             //根据路由的参数值获得控制器的名称
 96             string controllerName = context.RouteData.GetRequiredString("controller");
 97 
 98             //根据路由的参数获得控制器组的名称
 99             string area = context.RequestContext.RouteData.Values["area"].ToString();
100             return "Area/" + area + "/Views/" + controllerName + "/"+viewName ;
101         }
102 
103         /// <summary>
104         /// 这个一般匹配母版页的文件路径
105         /// </summary>
106         /// <param name="context"></param>
107         /// <param name="viewName"></param>
108         /// <returns></returns>
109         public string FormatPartialViewName(ControllerContext context, string viewName)
110         {
111             //根据路由的参数获得控制器组的名称
112             string area = context.RequestContext.RouteData.Values["area"].ToString();
113             return "Area/" + area + "/Views/Shared/" + viewName;
114         }
115 
116     }

转载于:https://www.cnblogs.com/qingyuan/archive/2009/11/04/1596071.html

MVC进阶学习--个性化目录结构(三)相关推荐

  1. JavaSE进阶学习笔记-目录汇总(待完成)

    声明:此博客来自于黑马程序员学习笔记,并非商用,仅仅是为了博主个人日后学习复习用,如有冒犯,请联系qq208820388立即删除博文,最后,来跟我一起喊黑马牛逼黑马牛逼黑马牛逼 JavaSE进阶学习笔 ...

  2. 嵌入式Linux系统编程学习之一目录结构

    嵌入式Linux系统编程学习之一目录结构 文章目录 嵌入式Linux系统编程学习之一目录结构 前言 一.Linux目录结构 前言 Linux目录结构 一.Linux目录结构 /bin:存放Linux的 ...

  3. MVC进阶学习--HtmlHelper控件解析(三)

    1.LinkExtensions类       该类主要用于生成相关链接,主要扩展了ActionLink和RouteLink方法 2.ActionLink        ActionLink扩展方法主 ...

  4. Linux系统学习:目录结构和文件管理指令

    Linux 对文件目录的抽象 Linux 对文件进行了一个树状的抽象./代表根目录,每一节目录也用/分开,所以在上图所展示的/usr/bin/rm中,第一级目录是/根目录,第二级目录是usr目录,第三 ...

  5. MVC进阶学习--HtmlHelper控件解析(一)

    1.HtmlHelper类       HtmlHelper类位于System.Web.MVC.Html命名空间下.主要包括FormExtensions,InputExtensions, LinkEx ...

  6. 关于MVC项目目录结构调整的想法

    MVC项目的默认目录结构: Scripts               : js 文件 Content               : css, image 等文件 Controllers       ...

  7. ASP.NET MVC 5 学习教程:添加控制器

    ASP.NET MVC 5 学习教程:添加控制器 原文 ASP.NET MVC 5 学习教程:添加控制器 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控 ...

  8. SSM框架学习——Maven进阶学习

    her~~llo,我是你们的好朋友Lyle,是名梦想成为计算机大佬的男人! 博客是为了记录自我的学习历程,加强记忆方便复习,如有不足之处还望多多包涵!非常欢迎大家的批评指正. 今天我们进入新的学习环节 ...

  9. ASP.NET MVC 5 学习教程:控制器传递数据给视图

    起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 通过控制器访问模型的数据 生成的代码详解 使用 SQL Se ...

最新文章

  1. 【工具】更新云文档办公利器汇总,腾讯文档测试文件上传,云文档对比测试报告...
  2. How does a relational database work
  3. NASA PHM数据集相关
  4. mysql int 补零_mysql int(11)字段左边自动补零了
  5. 阿里云上JDK安全证书的实际位置
  6. 深圳腾讯java小星星_腾讯自研沙盒手游《手工星球》邀你共赴星派对,来CJ现场一起嗨!...
  7. Android 设置Activity样式 透明度
  8. 全国计算机等级考试题库二级C操作题100套(第11套)
  9. nginx 实用配置问题总结
  10. nyoj 21 三个水杯 BFS
  11. 代码写好了怎么在php里裕兴_8 行代码用Python画一个中国地图
  12. matlab求根的原程序,MATLAB求根程序求帮助
  13. a中嵌套div的问题
  14. SharePoint:扩展DVWP - 第10部分:在表单操作工作流中传递工作流变量
  15. 智慧城市是啥?能少点雾霾吗?
  16. GetTickCount
  17. 徐思 201771010132
  18. 百度地图获取某个城市的经度纬度
  19. 【Web安全笔记】之【11.0 其他】
  20. word2003流程图变成图片_怎样将word文档的部分内容(流程图)制作成图片 详细始末...

热门文章

  1. 50岁开始学python_再过两年C语言就50岁了,这么老的编程语言怎么还没有过时?...
  2. 基于卷积神经网络的图像情感分析模型,Python实现
  3. 深度学习TensorFlow的55个经典案例
  4. java 指定格式的date_指定格式的日期字符串转化成java.util.Date类型日期对象
  5. jquery如何拿到一个对象_jQuery 怎么获取对象
  6. python语言继承6.3节例6-1中的person_第6.3节 Python动态执行之动态编译的compile函数...
  7. php 取一条数据,php 读取txt 每次固定输出一条数据用什么方法实现?
  8. linux定时删除文件指令,Linux实践——定时删除目录下面的文件
  9. oracle更换年,Oracle数据库更换服务器10分钟切换方案
  10. java 消息队列_消息队列-RabbitMQ在JAVA中的应用(1)