对于一个较大规模的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的路由映射的更多相关文章

  1. ASP.NET MVC 4 (一)路径映射

    原文:ASP.NET MVC 4 (一)路径映射 正如ASP.NET MVC名字所揭示的一样,是以模型-视图-控制设计模式构建在ASP.NET基础之上的WEB应用程序,我们需要创建相应的程序类来协调处 ...

  2. MVC 插件化框架支持原生MVC的Area和路由特性

    .NET MVC 插件化框架支持原生MVC的Area和路由特性 前面开放的源码只是简单的Plugin的实现,支持了插件的热插拔,最近晚上偶然想到,原生的MVC提供Areas和RouteAtrribut ...

  3. ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上

    原文:ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上 ASP.NET MVC默认采用基于标准特性的Model验证机制,但是只有应用在Model ...

  4. ASP.NET MVC中Area的另一种用法

    ASP.NET MVC中Area的另一种用法 [摘要]本文只是为一行代码而分享 context.MapRoute("API", "api/{controller}/{ac ...

  5. ASP.NET MVC 基于角色的权限控制系统的示例教程

    上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于 ...

  6. ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则

    原文:ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则 对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象, ...

  7. Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径

    Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径 我们要实现 通过路由 匹配出 博客地址 和博客文章地址 例如下面的这两个地址 //http://www.cnblogs.com/ma ...

  8. 白话ASP.NET MVC之一:Url 路由

    好久没有写关于ASP.NET MVC的东西了,虽然<ASP.NET MVC4框架揭秘>已经完完整整的看完一遍,但是感觉和一锅粥差不多,没什么可写的,因为我自己不理解,也就写不出来.现在开始 ...

  9. 给Asp.Net MVC及WebApi添加路由优先级

    一.为什么需要路由优先级 大家都知道我们在Asp.Net MVC项目或WebApi项目中注册路由是没有优先级的,当项目比较大.或有多个区域.或多个Web项目.或采用插件式框架开发时,我们的路由注册很可 ...

随机推荐

  1. css3作3D旋转视频展示

    代码如下: <!doctype html> <html lang="en"> <head> <meta charset="UTF ...

  2. 苹果手机 iTunes 资料备份到另一手机

    百度教程 https://jingyan.baidu.com/article/d621e8da332e602865913f8e.html 直接使用iTunes将老手机的资料备份, (可能需要关闭手机定 ...

  3. svn配置及基本使用

    svn软件下载地址http://subversion.apache.org/packages.html在安装TortoiseSVN时安装客户端和服务端 下以svn在windows下使用为例,linux ...

  4. mysql事务之一:MySQL数据库事务隔离级别(Transaction Isolation Level)及锁的实现原理

    一.数据库隔离级别 数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数 ...

  5. Docker构建ssh镜像

    FROM ubuntu MAINTAINER ggzone xxx@live.com ENV REFRESHED_AT 2015-10-21 RUN apt-get -qqy update & ...

  6. Hadoop入门介绍一

    Hadoop1.是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储.2.Hadoop实现了一个分布式文件 ...

  7. mysql日期类型

    日期类型 DATE TIME DATETIME TIMESTAMP YEAR 作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等 YEAR YYYY(1901/2155) DAT ...

  8. MySql主从复制原理和环境配置搭建

    主从复制原理 实质就是通过二进制的sql文件实现主从复制 MySQL的主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现,其复制功能并不是copy文件来实现的,而是借助binlo ...

  9. Git的配置和使用帮助

    Git的配置和使用帮助 1.Git的配置 ============== Git有三个地方可以存放配置:系统级配置文件/etc/gitconfig.用户级配置文件~/.gitconfig和仓库级配置文件 ...

  10. linux cp -r chmod -R 递归拷贝 删除 改权限

    在linux下拷贝的时候有时候会出现cp:omitting directory的错误 ,例如 cp:omitting directory "bbs" 说明bbs目录下面还有目录,不 ...