zoukankan      html  css  js  c++  java
  • asp.net MVC 多系统目录结构

    学习了几天的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/来访问

    复制代码
     1         public override void RegisterArea(AreaRegistrationContext context) 
     2         {
     3 
     4             context.MapRoute(
     5                  "supervise_list",
     6                  "supervise/list/{controller}/{action}/{id}",
     7                  new { controller = "Home", action = "Index", id = UrlParameter.Optional },
     8                  new string[] { "MvcProjects.Areas.supervise.Controllers.list" }
     9              );
    10 
    11             context.MapRoute(
    12                  "supervise_default",
    13                  "supervise/{controller}/{action}/{id}",
    14                  new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    15                  , new string[] { "MvcProjects.Areas.supervise.Controllers" }
    16              );
    17         }
    复制代码

    不过这个方法我认为有以下几个缺点,例如有两个重复的控制器/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.统一命名规范,避免控制器重复命名,而且可以快速定位到控制器存放位置

  • 相关阅读:
    grep
    [NOI2009]植物大战僵尸
    sed
    YY的GCD
    awk
    CF1100E
    cat
    tac
    [学习笔记]基数排序
    more
  • 原文地址:https://www.cnblogs.com/shijiehaiyang/p/13618009.html
Copyright © 2011-2022 走看看