Asp.net MVC 基于Area的路由映射
对于一个较大规模的Web应用,我们可以从功能上通过Area将其划分为较小的单元。每个Area相当于一个独立的子系统,具有一套包含Models、Views和Controller在内的目录结构和配置文件。一般来说,每个Area具有各自的路由规则(URL模版上一般会体现Area的名称),而基于Area的路由映射通过AreaRegistration进行注册。
一、创建Areas
右键工程 -> 添加->区域
添加后生成一套包含Models、Views和Controller在内的目录结构和配置文件;只是多了一个 HomeAreaRegistration.cs文件
系统自动生成HomeAreaRegistration类 继承AreaRegistration
public class HomeAreaRegistration : AreaRegistration
{ public override string AreaName
{
get
{
return "Home";
}
} public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Home_default",
"Home/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
AreaRegistration:
// 摘要:
// 提供在 ASP.NET MVC 应用程序内注册一个或多个区域的方式。
public abstract class AreaRegistration
{
// 摘要:
// 初始化 System.Web.Mvc.AreaRegistration 类的新实例。
protected AreaRegistration(); // 摘要:
// 获取要注册的区域的名称。
//
// 返回结果:
// 要注册的区域的名称。
public abstract string AreaName { get; } // 摘要:
// 注册 ASP.NET MVC 应用程序中的所有区域。
public static void RegisterAllAreas();
//
// 摘要:
// 使用指定的用户定义信息在 ASP.NET MVC 应用程序内注册所有区域。
//
// 参数:
// state:
// 一个包含要传递到区域中的用户定义信息的对象。
public static void RegisterAllAreas(object state);
//
// 摘要:
// 使用指定区域的上下文信息在 ASP.NET MVC 应用程序内注册某个区域。
//
// 参数:
// context:
// 对注册区域所需的信息进行封装。
public abstract void RegisterArea(AreaRegistrationContext context);
}
RegisterArea 方法不需要我们手动去调用,在 Global.asax 中的 Application_Start 方法已经有下面这样一句代码为我们做好了这件事:
AreaRegistration.RegisterAllAreas();
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles); }
这时候如果你在 根目录的 Controller 文件 已经新建了一个HomeController 运行工程项目会报错,会提示已经存在Home
当Area被注册的时候,Area中定义的路由被限制了只寻找 Area 中的Controller。然而我们在RouteConfig.cs文件的RegisterRoutes方法中定义的路由并没有类似的限制
这时候在系统默认路由配置RouteConfig.cs文件中做修改
配置中添加 namespaces 指定命名空间
添加了 namespaces 参数后,路由系统在对这个路由进行匹配时,优先匹配指定命名空间的controller,如果匹配到则即刻停止查找,如果在指定的命名空间下没有匹配到对应的controller,再按照一般的方式进行匹配。
public class RouteConfig
{ private static string[] namespaces = new string[] { "Bp.GMS.Web.Controllers" };
public static void RegisterRoutes(RouteCollection routes)
{ routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: namespaces
);
}
}
Asp.net MVC 基于Area的路由映射的更多相关文章
- ASP.NET MVC 4 (一)路径映射
原文:ASP.NET MVC 4 (一)路径映射 正如ASP.NET MVC名字所揭示的一样,是以模型-视图-控制设计模式构建在ASP.NET基础之上的WEB应用程序,我们需要创建相应的程序类来协调处 ...
- MVC 插件化框架支持原生MVC的Area和路由特性
.NET MVC 插件化框架支持原生MVC的Area和路由特性 前面开放的源码只是简单的Plugin的实现,支持了插件的热插拔,最近晚上偶然想到,原生的MVC提供Areas和RouteAtrribut ...
- ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
原文:ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上 ASP.NET MVC默认采用基于标准特性的Model验证机制,但是只有应用在Model ...
- ASP.NET MVC中Area的另一种用法
ASP.NET MVC中Area的另一种用法 [摘要]本文只是为一行代码而分享 context.MapRoute("API", "api/{controller}/{ac ...
- ASP.NET MVC 基于角色的权限控制系统的示例教程
上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于 ...
- ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则
原文:ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则 对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象, ...
- Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径
Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径 我们要实现 通过路由 匹配出 博客地址 和博客文章地址 例如下面的这两个地址 //http://www.cnblogs.com/ma ...
- 白话ASP.NET MVC之一:Url 路由
好久没有写关于ASP.NET MVC的东西了,虽然<ASP.NET MVC4框架揭秘>已经完完整整的看完一遍,但是感觉和一锅粥差不多,没什么可写的,因为我自己不理解,也就写不出来.现在开始 ...
- 给Asp.Net MVC及WebApi添加路由优先级
一.为什么需要路由优先级 大家都知道我们在Asp.Net MVC项目或WebApi项目中注册路由是没有优先级的,当项目比较大.或有多个区域.或多个Web项目.或采用插件式框架开发时,我们的路由注册很可 ...
随机推荐
- vc访问ACCESS数据库
在现代软件开发中,数据库技术被越来越广泛应用,很多项目都存在着大量的数据需要存储,通常都会采用数据库来存储这些数据.最初,数据库厂商推出一个新的数据库产品时,相应的,他会为程序员提供一套访问该数据库的 ...
- linux下通过sysfs操作GPIO
linux下通过sysfs操作GPIO 在嵌入式设备中对GPIO的操作是最基本的操作.一般的做法是写一个单独驱动程序,网上大多数的例子都是这样的.其实linux下面有一个通用的GPIO操作接口,那就是 ...
- shutil模块,ZipFile 和 TarFile 两个模块
高级的文件.文件夹.压缩包处理模块 shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中,可以部分内容 shutil.copyfile(src, ...
- 第七章 JVM体系结构与工作方式
JVM能跨计算机体系结构来执行Java字节码,主要是由于JVM屏蔽了与各个计算机平台的软件和硬件之间的差异. 7.1 JVM体系结构 7.1.1 何谓JVM 模拟一个计算机来达到一个计算机所具有的计算 ...
- 在Altium Designer 9中如何实现元器件旋转45°放置
方法一: 双击元件手工输入指定角度. 方法二: 在Preferences >> PCB Editor >> General中将Rotation Step(旋转的步进值)由90改 ...
- 南京邮电大学网络攻防平台WEB题
平台地址:http://ctf.nuptsast.com/ 签到题: 右键查看源代码,得到flag md5 collision: 传入的a的md5值要为0e开头的,但不能是QNKCDZO,百度一个0e ...
- 虚拟机之 LAMP
LAMP 就是Linux apache mysql php 一.下载: 安装下载工具 yum install wget -y mysql:5.5.47 wget http://mirrors.sohu ...
- saltstack系列(二)——zmq应答模式
python zeromq介绍 1.ZeroMQ并不是一个对socket的封装,不能用它去实现已有的网络协议. 2.有自己的模式,不同于更底层的点对点通讯模式. 3.有比tcp协议更高一级的协议(当然 ...
- 安卓 textview 换行 不满就换了
public static String ToDBC(String input) { char[] c = input.toCharArray(); for (int i = 0; i < c. ...
- Python:cmd传参
假如你写了一个文件test.py,你需要三个参数,你运行时: python test.py arg1 arg2 arg3 在test.py中读取这几个参数: import sys print 'Num ...