经常需要描述这样的项目结构

~:.        //web根目录
├─.admin      //管理员功能目录
│  └─index.html    //管理员目录页面
├─.user                  //用户功能目录
│  └─index.html      //用户功能目录
└─index.html          //首页

在普通的mvc之下,我们需要将每个controller和view都写在固定的页面中,这样所有的文件都堆砌在这两个目录中,

对于普通的小型项目,这样或许是比较方便的解决方案,但需要将项目目录进行细致的划分的时候默认的mvc目录就

无法实现我们需要的功能了。

一般我们会使用两种方式来实现

1.通过自定义路由+自定义视图引擎

2.使用area来对每个目录进行具体的管理

示例如下:

描述:系统包括三种主要用户类型,学生、教师、管理员,对于每种用户的相关功能代码分类进行整体,便于集中管理也利于

区分其他功能避免文件较多产生歧义

1.通过自定义路由+自定义视图引擎

首先定义路由规则,在项目目录下的App_Start/RouteConfig.cs文件中进行配置

 public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); //添加自定义的路由规则
routes.MapRoute(
//根据约定,需要保证路由名的唯一性
name: "teacher",
//此处通过添加teacher部分来区分教师的功能页面
url: "teacher/{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
//此处由于多个路由规则都使用了名为Home的controller,所以需要
//传入名称空间来保证控制器的唯一性
namespaces:new string[] { "SCMS.Controllers.teacher" });
routes.MapRoute(
name: "manager",
url: "manager/{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "SCMS.Controllers.manager" });
routes.MapRoute(
name: "admin",
url: "admin/{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "SCMS.Controllers.admin" }); //系统定义的路由规则
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "SCMS.Controllers" });
}

重写视图引擎部分

构造如下的一个类,继承RazorViewEngine类,并重写ViewLocationFormats的内容

public class ViewEngine : RazorViewEngine
{ public ViewEngine()
{
ViewLocationFormats = new[]
{
"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.cshtml",
"~/Views/admin/{1}/{0}.cshtml",
"~/Views/teacher/{1}/{0}.cshtml",
"~/Views/manager/{1}/{0}.cshtml"
};
} }

清除原有的视图引擎并将重写的视图引擎传入,文件位置为全局Global.asax文件

 protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
//注意此处
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new ViewEngine());
}

根据网上教程经过尝试后发现能够实现自定义目录的目的,但是根据此处的view解析目录,系统默认提供的

解析方式和自定义的解析方式只有一个能保证访问成果,若有使用不当之处望周知。此处给出一个不算恰当

的解决方案,将直接存放在默认位置的首页也独立管理即可。然后去掉"~/Views/{1}/{0}.cshtml"项,加入

"~/Views/Home/{1}/{0}.cshtml"

至此,第一种方式已经结束

2.使用area来对每个目录进行具体的管理

通过第一种办法虽能实现我们需要的功能,但是对于功能较多的项目来说对于每一个功能都需要单独处理,

这样需要重写大量的路由规则和view匹配规则,也可能是对mvc的了解不够所以没发现更好的办法,这里

就可以使用area区域来对其目录结构进行管理,如下

通过右键项目目录新建区域建立区域框架,然后创建了如下的目录结构

C:\USERS\IVES\DESKTOP\SCMS\SCMS\AREAS
├─admin
│  ├─Controllers
│  ├─Models
│  └─Views
│      ├─Home
│      └─Shared
├─manager
│  ├─Controllers
│  ├─Models
│  └─Views
│      └─Shared
└─teacher
    ├─Controllers
    ├─Models
    └─Views
        └─Shared

此处我们可以发现每个区域的目录结构树中均包含独立的MVC的结构,我们只需要将对应的每一个目录的内容放入对应的区域即可

具体内容见下图

如图,我们只需要将原来直接写在项目路径下的相关内容直接写在此处对应area中即可,其他与原来的使用方式没有任何差别

此处的第二种方式既直挂又简单快捷,推荐使用

记录下来,留待后查,同时方便他人。

联系我进行交流。renhanlinbsl@163.com

2017.11.15

15:37

asp.net mvc area实现多级controller和多级view的更多相关文章

  1. ASP.NET MVC Area使用-将Area设置成独立项目

    环境说明:Vistual Studio 2013 MVC 4.0 其实关于ASP.NET MVC Area使用的基础知识可以参考 http://www.cnblogs.com/willick/p/33 ...

  2. ASP.NET MVC中将数据从Controller传递到视图

    ASP.NET MVC中将数据从Controller传递到视图方法 1.ViewData ViewData的类型是字典数据,key-value 如:ViewData["Data"] ...

  3. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  4. 白话ASP.NET MVC之二:Controller激活系统的概览

    前文简介:我们抽象类路由规则的对象,RouteBase是路由对象的抽象基类,ASP.NET 的路由系统中有唯一一个从RouteBase继承的路由对象,那就是Route类型了.我们注册了路由对象Rout ...

  5. ASP.NET MVC Area 的使用

    MVC提供Area机制,在同一个项目之内就能够切割出不同的ASP.NET MVC网站. 插入:首先在相同的位置,比如说同一个文件夹(如:Controllers)是不能创建俩个相同名称的文件(如:Hom ...

  6. Asp.net MVC area

    妈的,今天去携程面试,技术面了三轮,竟然让我走了,没有然后了,你不要老子,干嘛还面那么多轮,害的老子一上午的时间没了,气死我了. 好了,总结下面试中的问题吧, 1.GC 2.设计模式 3.做过的项目的 ...

  7. 9、ASP.NET MVC入门到精通——Controller(控制器)

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 Controller主要负责响应用户的输入.主要关注的是应用程序流,输入数据的处理,以及对相关视图(View)输出数据的提供. 继承自:Sy ...

  8. ASP.NET MVC 学习8、Controller中的Detail和Delete方法

    参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-details-and ...

  9. ASP.NET MVC 学习4、Controller中添加SearchIndex页面,实现简单的查询功能

    参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-method ...

  10. ASP.NET MVC 学习3、Controller左手从Model获取数据,右手传递到View页面

    参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/accessing-your-models-dat ...

随机推荐

  1. Vue学习之路5-v-model指令

    1. 指令释义 v-model在表单控件或者组件上创建双向绑定,本质上是负责监听用户的输入事件(onchange,onkeyup,onkeydown等,具体是哪个,还请查阅官方底层实现文档)以更新数据 ...

  2. [福大软工] Z班——个人技术博客评分

    个人技术博客 作业地址 https://edu.cnblogs.com/campus/fzu/SoftwareEngineering2015/homework/1070 作业要求 个人技术博客单次作业 ...

  3. mysql 数据备份与数据导入到出

    一.数据备份 #1. 物理备份: 直接复制数据库文件,适用于大型数据库环境.但不能恢复到异构系统中如Windows. #2. 逻辑备份: 备份的是建表.建库.插入等操作所执行SQL语句,适用于中小型数 ...

  4. 【Teradata】grouping和rollup窗口函数

    1.group by后带rollup子句 先按一定的规则产生多种分组,然后返回各个分组所产生的结果集的并集,且没有去掉重复数据(统计出的数据是求和还是最大值还是平均值等这就取决于SELECT后的聚合函 ...

  5. Ant Design Pro的dva-loading

    loading为dva的插件,全局可用,它里面维护了一些布尔值,用于控制loading动画效果的显示与隐藏,通过@connect()来注入使用 官网介绍如下: https://dvajs.com/ 在 ...

  6. 【BZOJ3451】Normal

    [BZOJ3451]Normal Description 某天WJMZBMR学习了一个神奇的算法:树的点分治! 这个算法的核心是这样的: 消耗时间=0 Solve(树 a) 消耗时间 += a 的 大 ...

  7. vue的过滤器语发及应用案例

    1.使用地方: 双花括号插值处或  组件属性处   例: {{ message | capitalize }} <div v-bind:id="rawId | formatId&quo ...

  8. 指数加权移动平均法(EWMA)

    ** 本文内容来自于吴恩达深度学习公开课 1.概述 加权移动平均法,是对观察值分别给予不同的权数,按不同权数求得移动平均值,并以最后的移动平均值为基础,确定预测值的方法.采用加权移动平均法,是因为观察 ...

  9. Ansible 拷贝文件或目录

    写法如下: [root@localhost ~]$ ansible 192.168.119.134 -m copy -a "src=/etc/passwd dest=/tmp/passwd ...

  10. PHP设计模式_工厂模式

    个人理解工厂类相当于平时用的基类,只需要把类new一次然后付给一个变量,以后直接引入基类调用变量使用类里的方法即可 了解 工厂模式,工厂方法或者类生成对象,而不是在代码中直接new. 使用工厂模式,可 ...