学习了几天的mvc5,发现vs把所有的控制器都放在同一个目录Controllers目录下,细想一下,假如一个项目包含几个系统:

行政办公系统、培训管理系统、督办管理系统、会议管理系统……

如果还把控制器都放在同一个目录下,那就只有一个字,乱!

如果把一个系统部署成对应一套mvc目录结构(即对应一个应用或站点),那就变成两个字,更乱!因为这样就无法共享css、js、图片等资源。

有问题找度娘,发现微软已经提供解决方案,那就是使用Areas,一个Area对应上面的一个系统,添加方法:

例如我添加两个系统:supervise和training,即督办管理系统和培训管理系统,添加后自动生成目录结果如下:

访问的url为:http://localhost:3634/supervise/

这样一来,就基本上满足我的需求了。但是有多想了一步,如果系统以后功能复杂了呢?

例如我的综合考评系统,功能模块有:

流程考核、日常考核、PMT考核、工作计划管理、接口、后台、统计,还有大把基础数据配置页面,

而且大模块里面还有小模块,例如统计现在就有大大小小10来个页面了。

如果把1个系统的如此多模块放在同一个Controllers目录下,是不是还会出现上面说的乱的问题?

继续捣鼓,又发现了Controllers目录下是完全可以新建子目录的,而且把控制器放在哪个子目录下,对于访问的url完全没影响,例如新建一个叫supList的控制器

放在/supervise/Controllers/目录下,访问地址为:http://localhost:3634/supervise/supList,

放在/supervise/Controllers/list/目录下,访问地址TM还是:http://localhost:3634/supervise/supList

不过这样又有问题了,就是Controllers目录下(包括所有子目录)的所有控制器,名字都不能重复,

而且你在不同子目录添加重复名字的控制器时,vs2013根本就不会提示你重复,

研究了一下,解决方法有2个:

1.执行命名规范:子目录的控制器,名字必须以子目录名字做为开头

例如在/supervise/Controllers/list/下面添加的控制器,名字必须以listSup,listStatistics

这样做,从理论上来说,不能100%消灭重复命名的问题,但在实际开发工作中,应该是不会出现的

2.配置路由规则

修改/supervise/目录下的路由文件superviseAreaRegistration.cs,给每个子目录都添加上命名空间,然后使用http://localhost:3634/supervise/list/suplist/来访问

         public override void RegisterArea(AreaRegistrationContext context)
{ context.MapRoute(
"supervise_list",
"supervise/list/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new string[] { "MvcProjects.Areas.supervise.Controllers.list" }
); context.MapRoute(
"supervise_default",
"supervise/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
, new string[] { "MvcProjects.Areas.supervise.Controllers" }
);
}

不过这个方法我认为有以下几个缺点,例如有两个重复的控制器/supvise/listController和/supvise/list/listController,

1.视图在Views下面也应该保持与控制器Controllers相同的目录结构,但这些工作必须手工完成,不能使用vs右键的【添加视图】--当然,这个不算什么问题

2.对于/supvise/list/listController来说,必须指定视图路径,即 return View("../list/Index.cshtml");--指定就指定呗,好像也不算大问题

3.在vs里面,右键【转到视图】,你就会发现,打开的视图并不是方法里面指定的/Views/list/Index.cshtml,而是/Views/Index.cshtml

4.打开视图/Views/list/Index.cshtml,再右键【转到控制器】,竟然提示找不到匹配的控制器

第3、4个缺点就可以直接要人命了,因为控制器与视图紧密结合,在开发过程中,肯定会频繁来回切换,如果没有这右键的支持,开发效率将大大降低。

鉴于上面的评比,我还是选择了第1个解决方案。

============

【总结】:

1.部署多个系统,使用Areas来解决,一个Area对应一个系统,使用http://www.xxx.com/areaName/来访问

2.如果系统功能复杂,可以在Controllers下面建立子文件夹,对控制器进行分类存放

3.视图按照vs默认即可,即一个控制器对应一个文件夹,全部放在/Views/目录下

4.统一命名规范,避免控制器重复命名,而且可以快速定位到控制器存放位置

asp.net MVC 多系统目录结构的更多相关文章

  1. asp.net mvc多级目录结构和多级area实现技巧

    今天在工作要实现这个多级area.其原因是这个项目需要多级的功能,大的类别里有小的类别,小的类别里有具体的功能项,每一个功能项还有若干动作Action,所以在菜单和mvc工程的结构上都需要有体现多级的 ...

  2. ASP.NET MVC教程二:ASP.NET MVC应用程序结构详解

    在上一篇文章中,讲解了一些MVC的概念,并且创建了第一个ASP.NET MVC项目,这篇文章将讲解ASP.NET MVC程序中的代码解构,新创建的MVC应用程序解构如下图所示: 一.App_Data ...

  3. asp.net mvc 多级目录结构

    ikmb@163.com ASP.NET MVC默认的文件组织和URL访问都是一级,我们通常要将一个功能模块组织到一个目录下.方法是:1.文件组织 分别在Controllers和Views文件夹下建议 ...

  4. ASP.NET MVC 项目文件夹结构

    首先,打开Visual Studio, 新建一个demo 项目的solution,选择 Blank Soution. 第二步,创建文件夹,按自己的需求创建.在这个Demo 中,我将创建4个文件夹. P ...

  5. ASP.Net MVC默认目录结构

    1.Controllers 保存处理URL请求的Controller类 2.Models 保存操纵业务与数据对象的类 3.Views 保存UI模板页面 4.Scripts 保存Javascript库文 ...

  6. 【Pro ASP.NET MVC 3 Framework】.学习笔记.11.ASP.NET MVC3的细节:概览MVC项目

    书Adam The Definitive Guide to HTML5 Adam Applied ASP.NET 4 in Context and Pro ASP.NET 4 到此为止,我们已经学了为 ...

  7. 在 ASP.NET MVC 应用中使用 NInject 注入 ASMX 类型的 Web Service

    这几天,有同学问到为什么在 ASP.NET MVC 应用中,无法在 .ASMX 中使用 NInject 进行注入. 现象 比如,我们定义了一个接口,然后定义了一个实现. public interfac ...

  8. ASP.NET MVC Web API使用示例

    上篇博客讲解rest服务开发时,曾经提到过asp.net mvc中的rest api,由于篇幅原因,没有在上篇博客中进行讲解,这里专门拿出来进行讨论.还是一样引用上次的案例,用asp.net mvc提 ...

  9. ASP.NET MVC 学习之路-3

    本文在于巩固基础 到这里不得不说ASP.NET MVC一个规则:惯例优先原则 ASP.NET会假定开发人员遵循特定的规则来构建自己的程序而不是使用配置文件 ASP.NET MVC文件夹结构也遵循惯例优 ...

随机推荐

  1. php PDO mysql

    php PDO写法连接mysql: $db=new PDO("mysql:host=localhost;dbname=sql","root","roo ...

  2. sql左外连接、右外连接、group by、distinct(区别)、intersect(交叉)、通配符、having

    连接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定连接条件.WHERE和HAVING子句也可以包含搜索条件,以进一步筛选连接条件所选的行.             连接可分为以下几类 ...

  3. 在 web 容器中运行 cxf

    <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC &q ...

  4. eclipse如何恢复误删文件

    刚刚真的要吓死宝宝了,不是说宝宝心里素质差,是因为刚刚误删的文件实在是太重要了,废话不多说了,正题 如何恢复eclipse误删的文件 1,当时被误删了,可立即 Ctrl+z 即可恢复误删文件; 2,时 ...

  5. 解决 Eclipse Indigo 3.7、ADT 中文字体偏小,完美 Consolas 微软雅黑混合字体!

    Eclipse是著名的跨平台的自由集成开发环境(IDE).6月22日Eclipse 3.7 正式发布,代号是 Indigo . 在 Windows 7 下初始后化,发现界面变化不大,但中文字体却面目全 ...

  6. python 几种方法实现随机生成8位同时包含数字、大写字符、小写字符密码的小程序

    python 实现随机生成包8位包含大写字母.小写字母和数字的密码的程序.要求:1用户输入多少次就生成多少条密码,2要求密码必须同时包含大写字母.小写字母和数字,长度8位,不能重复代码如下: impo ...

  7. CentOS7查看CPU个数

    查看逻辑cpu个数:cat /proc/cpuinfo | grep "processor" | wc -l 查看物理cpu个数:cat /proc/cpuinfo | grep ...

  8. NetCore偶尔有用篇:NetCore项目WebApi返回Json属性大小写

    一.概述 1.前面文章介绍Controller的大小写问题时,目的只是介绍它的差异性,有同学回复了,这里把它作为一个点写一下吧. 二.默认定义的转换结果 1.写一个返回对象的方法. 2.运行查看结果. ...

  9. ABP框架入门踩坑-添加实体

    添加实体 ABP踩坑记录-目录 这里我以问答模块为例,记录一下我在创建实体类过程中碰到的一些坑. 审计属性 具体什么是审计属性我这里就不再介绍了,大家可以参考官方文档. 这里我是通过继承定义好的基类来 ...

  10. AGC032D Rotation Sort

    题目传送门 Description 给定\(N\)的排列(\(N\leq5000\)),将任一区间最左侧的数插到该区间最右边的代价为\(A\),将任一区间最右侧的数插到该区间最左边的代价为\(B\), ...