有时候我们会碰到两个项目合在一起,那么必然会碰到两个同名的controller,其实MVC在注册路由,添加Route的时候可以指定当前规则解析那个命名空间下的所有Controller。

注:Controller的调用是通过IControllerFactory,反射调用目标Controller,不指定目标命名空间,直接从BuildManager.GetReferencedAssemblies();如下。

  private static List<Type> controllerTypes = new List<Type>();/// <summary>/// 静态构造函数/// </summary>static DefaultControllerFactory(){var assemblys = BuildManager.GetReferencedAssemblies();foreach (Assembly assembly in assemblys){var types = assembly.GetTypes().Where(a => typeof(IController).IsAssignableFrom(a));foreach (Type type in types){controllerTypes.Add(type);}}}/// <summary>/// 创建controller/// </summary>/// <param name="requestContext"></param>/// <param name="controllerName"></param>/// <returns></returns>public IController CreateController(RequestContext requestContext, string controllerName){string typeName = controllerName + "Controller";Type controllerType = controllerTypes.FirstOrDefault(a => a.Name == typeName);if (controllerType != null){return (IController)Activator.CreateInstance(controllerType);}return null;}

回归正题:如何支持多种命名空间

 public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute(name: "Default",url: "{controller}/{action}",defaults: new { controller = "Home", action = "Index" }, namespaces: new string[] { "MvcExpose.Controllers" });routes.MapRoute("Admin", "Admin/{controller}/{action}",new { controller = "Home", action = "Index"}, new string[] { "MvcExpose.Admin.Controllers" });}

切记:两种注册Url规则,要长度不一致,Default带有"{controller}/{action}/{id}"一直报错,以为在正则解析看来,无法区分两种路由规则的区别,因此当“http://localhost:4500/Admin/Home/Index”,系统先调用default的路由解析。

其实有一种更好的的方式:

就是建立所谓的区域,每一个区域就是一个独立的子系统,如下图:

其实最为重要的是用了AreaRegistration

public class AdminAreaRegistration : AreaRegistration{public override string AreaName{get{return "Admin";}}public override void RegisterArea(AreaRegistrationContext context){context.MapRoute("Admin_default","Admin/{controller}/{action}/{id}",new { controller="home",action = "Index", id = UrlParameter.Optional });}}

  在Global中,我们有一句:   AreaRegistration.RegisterAllAreas();调用这个方法的时候,当前Web应用所有直接或间接被引用的程序集会被加载,然后从这些程序集中解析出所有继承自AreaRegistration的类型并反射出对象,调用相应的RegisterArea。

 protected void Application_Start(){AreaRegistration.RegisterAllAreas();WebApiConfig.Register(GlobalConfiguration.Configuration);FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);}

原理:

MVC调用Controller是通过反射程序集中继承了IController的所有类(默认情况下),根据路由规则取出ControllerName,并实例化相对应的Controller实例,如果出现重名的Controller,会报错。

因此要指定好对应的命名空间,MVC将namespace存在RouteData的DateTokens中

十分直观的的看到,这样就给不同的路由规则,反射相应的命名空间下IController的实例!

转载于:https://www.cnblogs.com/cainiaoguoshi/p/4150097.html

MVC 支持同名路由,不同命名空间相关推荐

  1. 在controller中调用指定参数给指定表单_第005课:Spring Boot 中MVC支持

    Spring Boot 的 MVC 支持主要介绍实际项目中最常用的几个注解,包括 @RestController. @RequestMapping.@PathVariable.@RequestPara ...

  2. vue重复路由_解决vue路由name同名,路由重复的问题

    在项目中,想让路由后缀为空,或者index的时候,都跳转到路由为index的页面,于是在router中如下配置 routes: [{ path: '/', name: 'index', compone ...

  3. Taurus.MVC 支持Asp.Net Core 的过程

    前言: 这些天,似乎.NET Core相关的新闻和文章经常在我眼前晃~~~ 昨天,微软又发布了.Core 2.1,又愰了一下,差点没亮瞎我的眼睛. 好吧,大概是上天给我的暗示,毕竟 CYQ.Data  ...

  4. ASP.NET MVC学习之路由篇(2)

    ASP.NET MVC学习之路由篇(2) 原文:ASP.NET MVC学习之路由篇(2) 继ASP.NET MVC学习之路由篇(1)后继续学习. 7.解决与物理路径的冲突 当发送一个请求至ASP.NE ...

  5. 4. 用MVC实现URL路由

    用MVC实现URL路由 原文:http://quickstarts.asp.net/3-5-extensions/mvc/MvcUrlRouting.aspx 1. 介绍 MVC框架使用URL路由将U ...

  6. 第十五节:Asp.Net Core MVC和WebApi路由规则的总结和对比-第二十节

    一. Core Mvc 1.传统路由 Core MVC中,默认会在 Startup类→Configure方法→UseMvc方法中,会有默认路由:routes.MapRoute("defaul ...

  7. 为ASP.NET MVC应用添加自定义路由

    这里,我们将学习如何给asp.net mvc应用添加自定义路由.用自定义路由来修改默认路由表. 对一些简单的asp.net mvc应用,默认的路由表就已经足够了.但是,当你需要创建特殊的路由时,就需要 ...

  8. NopCommerce支持友好路由

    NopCommerce支持友好路由 转载于:https://www.cnblogs.com/chenjz/p/6293208.html

  9. 小米路由器开启DDNS并支持二级路由

    小米路由器开启DDNS具体的设置步骤可以参见这篇连接 [路由达人]简单两步搞定小米路由新增功能-DDNS(解析域名地址转向在线工具) - *(00)* - 博客园 由于路由器版本升级,web界面有所改 ...

最新文章

  1. Struts07---访问servlet的API
  2. 想开网店?向你推荐最好的开源电子商务平台
  3. hdu 1540(线段树单点更新 区间合并)
  4. 太棒了!想学英语的好好留着!
  5. 李宏毅 课程打包_按功能而不是按层打包课程
  6. Linux各发行版本简介
  7. perl里面隐式的继承
  8. 课程管理系统c语言程序,课程信息管理系统C语言程序Word版
  9. 字节对齐 pragma
  10. 提取swf素材_swf素材提取工具
  11. 微信公众号页面开发经验总结
  12. 中国34个省级行政区2000年-2021年逐月NDVI统计分析结果
  13. while语句没有花括号用法
  14. 请画出使用mapreduce对英文句子_英文写作中有哪些常见的标点符号问题?小心你的essay会被教授diss不专业...
  15. 惯用过程模型_惯用代码
  16. 更新:扫码即可实现丨用脚本快速查看自己被多少微信好友删除
  17. 从一个技术人员角度来谈谈10000小时定律
  18. 梦幻西游游戏官网服务器状态,梦幻西游:凌晨4点了,这个游戏究竟还有几个服务器不是鬼区?...
  19. 【ZeloEngine】沙箱机制
  20. 阿里巴巴技术委员会主席王坚眼中的人工智能

热门文章

  1. [YTU]_2878( 结构体--学生信息排序)
  2. exp--求以e为底的指数函数
  3. js css3实现tab,div+css+js实现tab页
  4. android_home is not set mac,mac解决appium-doctor报ANDROID_HOME is NOT set
  5. 管道符和作业控制 shell变量 环境变量配置文件
  6. yii2地址多级联动
  7. jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同怎么办
  8. TreeView控件节点重命名后没有进入beginEdit的解决方案
  9. C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别
  10. UA MATH567 高维统计专题1 稀疏信号及其恢复4 Basis Pursuit的算法 Projected Gradient Descent