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

~:.        //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. ubuntu16.04如何安装多个版本的CUDA

    我的机器是CUDA16.04的,之前装过CUDA10.0,因为一些原因,现在需要安转CUDA9.0. 1.首先https://developer.nvidia.com/cuda-90-download ...

  2. LeetCode算法题-Contains Duplicate(Java实现)

    这是悦乐书的第192次更新,第196篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第52题(顺位题号是217).给定一个整数数组,查找数组是否包含任何重复项.如果数组中至 ...

  3. Docker: docker container常用命令实战

    容器管理,容器常用选项 选项 描述 -i, –interactive 交互式 -t, –tty 分配一个伪终端 -d, –detach 运行容器到后台 -e, –env 设置环境变量 -p, –pub ...

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

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

  5. Boolean类型在EF和MySql中的映射关系

    MySQL没有Boolean类型.这也是比较奇怪的现象.例: create table xs ( id int primary key, bl boolean ) 这样是可以创建成功,但查看一下建表后 ...

  6. 【工具大道】ssh登录Linux服务器,并显示图形化界面

    本文地址 点击关注微信公众号 "程序员的文娱情怀" 分享提纲: 1. 概述 2. mac版实现ssh登录,显示图形化 1. 概述 平时ssh登录到Linux服务器都是在命令行下进行 ...

  7. MySQL初识

    1.MySQL版本 社区版:免费的,功能够用. 商业版:更能更加强大,更加稳定,但是收费的. 2.每个版本都分四个版本发布 Alpha版本:一般只在开发公司内部使用,不对外公开,测试.自我检查版本: ...

  8. 设计模式のChainOfResponsibilityPattern(责任链模式)----行为模式

    一.产生背景 职责链模式是一种行为模式,为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求.将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对象处理它.避免请求发送者与接 ...

  9. ①---Java开发环境配置

    Java 开发环境配置 以下将为大家介绍如何搭建Java开发环境. window系统安装java 下载JDK 首先我们需要下载java开发工具包JDK,下载地址:http://www.oracle.c ...

  10. tomcat (选号)公司tomcat无页面解决

    问:我现在的有的解决方法就是把上一次war包下下载下来,在重启tomcat 答:那不行,更新war包就没有意义了,你都没排查故障  就直接说war包少东西?主页都没有..还能少主页也不是404.war ...