asp.net mvc area实现多级controller和多级view
经常需要描述这样的项目结构
~:. //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的更多相关文章
- ASP.NET MVC Area使用-将Area设置成独立项目
环境说明:Vistual Studio 2013 MVC 4.0 其实关于ASP.NET MVC Area使用的基础知识可以参考 http://www.cnblogs.com/willick/p/33 ...
- ASP.NET MVC中将数据从Controller传递到视图
ASP.NET MVC中将数据从Controller传递到视图方法 1.ViewData ViewData的类型是字典数据,key-value 如:ViewData["Data"] ...
- 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 ...
- 白话ASP.NET MVC之二:Controller激活系统的概览
前文简介:我们抽象类路由规则的对象,RouteBase是路由对象的抽象基类,ASP.NET 的路由系统中有唯一一个从RouteBase继承的路由对象,那就是Route类型了.我们注册了路由对象Rout ...
- ASP.NET MVC Area 的使用
MVC提供Area机制,在同一个项目之内就能够切割出不同的ASP.NET MVC网站. 插入:首先在相同的位置,比如说同一个文件夹(如:Controllers)是不能创建俩个相同名称的文件(如:Hom ...
- Asp.net MVC area
妈的,今天去携程面试,技术面了三轮,竟然让我走了,没有然后了,你不要老子,干嘛还面那么多轮,害的老子一上午的时间没了,气死我了. 好了,总结下面试中的问题吧, 1.GC 2.设计模式 3.做过的项目的 ...
- 9、ASP.NET MVC入门到精通——Controller(控制器)
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 Controller主要负责响应用户的输入.主要关注的是应用程序流,输入数据的处理,以及对相关视图(View)输出数据的提供. 继承自:Sy ...
- ASP.NET MVC 学习8、Controller中的Detail和Delete方法
参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-details-and ...
- ASP.NET MVC 学习4、Controller中添加SearchIndex页面,实现简单的查询功能
参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-method ...
- ASP.NET MVC 学习3、Controller左手从Model获取数据,右手传递到View页面
参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/accessing-your-models-dat ...
随机推荐
- ASP.NET -- WebForm -- ViewState
ASP.NET -- WebForm -- ViewState 1. ViewState的作用 当 ASP .NET 中的表单被提交时,表单会随所有表单值一同重新出现.这是由于 ASP .NET 维 ...
- JavaScript -- 时光流逝(四):js中的 Math 对象的属性和方法
JavaScript -- 知识点回顾篇(四):js中的 Math 对象的属性和方法 1. Math 对象的属性 (1) E :返回算术常量 e,即自然对数的底数(约等于2.718). (2) LN2 ...
- docker 私有仓库简易搭建
概要 本地私有仓库 局域网私有仓库 总结 概要 docker hub 使用非常方便,而且上面有大量的镜像可以使用. 但是,每次都远程下载镜像速度非常慢,如果能在本地做一个 docker 的仓库,多人协 ...
- June 10. 2018, Week 24th, Sunday
There is no friend as loyal as a book. 好书如挚友,情谊永不渝. From Ernest Miller Hemingway. Books are my frien ...
- Vue技巧小结(持续更新)
1. 动态生成的input自动focus 背景: input元素在需要时才插入DOM,这时元素用autofocus属性第一次是可以获取焦点,但是如果有第二个,就不再生效,所以得另外的办法. 方法: / ...
- WPF 使用Console.Write打印信息到控制台窗口中
WPF中使用Console.Write函数来打印信息是没有意义的,因为并没有给其输出字符的窗口.对于桌面程序来说,这是十分合理的,然而有时为了方便调试,在程序编写过程中打印出信息给程序员看还是必要的, ...
- 文件是数据的流式IO抽象,mmap是对文件的块式IO抽象
文件是数据的流式IO抽象,mmap是对文件的块式IO抽象
- 启动PHP study时提示80端口或者3306端口被占用的解决办法
一.查看PID WIN+R打开命令行------>netstat -ano+回车,就会显示下面的信息: 二.打开任务管理器 Ctrl+Alt+Delete------>任务管理器,找到对应 ...
- 100Mbps和100Mb/s有什么不同
100Mbps 和 100Mb/s 有什么不同 Mbps=Mbit/s即兆比特每秒.Million bits per second的缩写 传输速率是指设备的的数据交换能力,也叫“带宽”,单位是Mbps ...
- 深入学习Redis:Redis内存模型
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 一.Redis内存统计 工欲善其事必先利其器,在说明Redis内存之前首先说明如何统计 ...