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

~:.        //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. LeetCode算法题-Remove Linked List Elements(Java实现)

    这是悦乐书的第189次更新,第191篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第48题(顺位题号是203).移除单链表中节点值为val的节点.例如: 输入:1-> ...

  2. Vue使用枚举类型实现HTML下拉框

    下拉框包含option中的Value和用来显示的选项, 一般后台都是使用的Value值,而不是显示在前台的选项 第一步: 编写下拉框需要的枚举类型 StatusEnum.java public enu ...

  3. 记录参加QCon2017北京站的心得

    如有侵权,请告知作者删除.scottzg@126.com 很荣幸参加QCon全球软件开发大会,这里特别感谢我们部门的总经理,也是<互联网广告算法和系统实践>此书的作者王勇睿.因为他我才有这 ...

  4. 【递推】ZSC1072: 数学、不容易系列之二—— LELE的RPG难题

    思路如下: f(n) = 1, ... , n-2 , n-1, n 前n-2个已涂好后,涂第n-1个即有2种情况: n-1的色与n-2和1的色都不相同,那么n就是剩下的那个色,没有选择. 即就是f( ...

  5. 【shell脚本】shell脚本实现的 函数差集查找

    文本地址 点击关注微信公众号 wenyuqinghuai 分享提纲: 1. 问题背景 2. 代码实现 1.问题背景 在做公司的测试的自动化测试时,覆盖了一些开发代码的函数,但是那些还没有做,使用一个函 ...

  6. HTTP Health Checks

    This article describes how to configure and use HTTP health checks in NGINX Plus and open source NGI ...

  7. mybatis generator使用方式

    资源: 一 https://files.cnblogs.com/files/jiuya/jdbcT.zip 二  https://files.cnblogs.com/files/jiuya/mybat ...

  8. 测试中 unittest.main(verbosity=1) 是什么意思

    这里的verbosity是一个选项,表示测试结果的信息复杂度,有三个值0 (静默模式): 你只能获得总的测试用例数和总的结果 比如 总共100个 失败20 成功801 (默认模式): 非常类似静默模式 ...

  9. PHP 依赖注入,依赖反转 (IOC-DI)

    https://my.oschina.net/u/3529405/blog/1821744 <?php /** * 依赖注入 IOC DI * 参考文章 * https://segmentfau ...

  10. spring 、spring boot 常用注解

    @Profile 1.用户配置文件注解. 2.使用范围: @Configration 和 @Component 注解的类及其方法, 其中包括继承了 @Component 的注解: @Service. ...