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[1] { "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
            );
        }
    }
时间: 2024-08-27 03:44:37

Asp.net MVC 基于Area的路由映射的相关文章

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

.NET MVC 插件化框架支持原生MVC的Area和路由特性 前面开放的源码只是简单的Plugin的实现,支持了插件的热插拔,最近晚上偶然想到,原生的MVC提供Areas和RouteAtrribute等路由特性标签,按照先前的做法,无法解析插件的路由特性和Areas,所以花费了两个晚上的时间,把插件给改进到支持Areas和路由特性,但同时也放弃了Web类插件的热插拔,Func类的插件依然支持热插拔. 下面是实现支持插件使用Areas和路由特性标签的流程: 原生的MVC在启动的时候需要执行两条代

ASP.NET MVC 3中的路由

准备发布新随笔,才发现草稿里还有几年前这篇烂了尾的,先放上来,有空再补完整吧-- (* 整理自<Pro ASP.NET MVC 3 Framework>学习笔记. *) 路由,正如其名,是决定消息经由何处被传递到何处的过程.也正如网络设备路由器Router一样,ASP.NET MVC框架处理请求URL的方式,同样依赖于一张预定义的路由表.以该路由表为转发依据,请求URL最终被传递给特定Controller的特定Action进行处理.而在相反的方向上,MVC框架的渲染器同样要利用这张路由表,生成

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

原文:ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上 ASP.NET MVC默认采用基于标准特性的Model验证机制,但是只有应用在Model类型及其属性上的ValidationAttribute才有效.如果我们能够将ValidationAttribute特性直接应用到参数上,我们不但可以实现简单类型(比如int.double等)数据的Model验证,还能够实现“一个Model类型,多种验证规则”,本篇文章将为你提供相关的解决方案(源代码

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

原文:ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则 对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象,在不同的使用场景中可能具有不同的验证规则.举个简单的例子,对于一个表示应聘者的数据对象来说,针对应聘的岗位不同,肯定对应聘者的年龄.性别.专业技能等方面有不同的要求.但是ASP.NET MVC的Model验证确是Model驱动的,因为验证规则以验证特性的形式应用到Model类型及其属性上.这样的验证

ASP.net MVC 基于角色的权限控制系统的实现

一.引言 我们都知道ASP.net mvc权限控制都是实现AuthorizeAttribute类的OnAuthorization方法. 下面是最常见的实现方式: public class CustomAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { if (!filterContext.RequestContext

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

上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于角色的权限控制方法. 基于角色的权限控制方法概述 基于角色的权限控制系统RBAC(Role Based Access Control)是目前最流行,也是最通用的权限控制系统.所谓基于角色的权限控制,就是将各个操作权限分组,每一个组就是一个角色,举个例子:管理员拥有所有的权限,编辑就只拥有写文章和发布

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

正如ASP.NET MVC名字所揭示的一样,是以模型-视图-控制设计模式构建在ASP.NET基础之上的WEB应用程序,我们需要创建相应的程序类来协调处理,完成从客户端请求到结果相应的整个过程: VS2012中一个典型的MVC工程结构是这样的: Controllers文件夹下存放控制类,Models文件下是业务数据模型类,Views文件下则是类似于aspx的视图文件.在传统ASP.NET form的应用程序中,客户端的请求最后都映射到磁盘上对应路径的一个aspx的页面文件,而MVC程序中所有的网络

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

一.为什么需要路由优先级 大家都知道我们在Asp.Net MVC项目或WebApi项目中注册路由是没有优先级的,当项目比较大.或有多个区域.或多个Web项目.或采用插件式框架开发时,我们的路由注册很可能不是写在一个文件中的,而是分散在很多不同项目的文件中,这样一来,路由的优先级的问题就突显出来了. 比如: App_Start/RouteConfig.cs中 routes.MapRoute( name: "Default", url: "{controller}/{action

ASP.NET MVC 学习一之路由

  本次学习的所有开发环境皆为VS2012+MVC4 一:什么是MVC:      假设你是第一次学习MVC,好吧我们不去理解它内部是如何去实现功能的,我们只从它表面的字母意思先去入门理解吧      M:models(模型)  V:view(视图)  C:controllers(控制器)     先不要去纠结这三个字母是什么东西吧,以及这三个东西有什么用!我们所要用的就是先记下这个三个字母!呵呵,是不是有点死记硬背的赶脚,我也是这么觉得的,有点想扔砖的感觉!(麻痹,博主想讲的啥!!!-__-!