MVC 支持同名路由,不同命名空间
有时候我们会碰到两个项目合在一起,那么必然会碰到两个同名的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的路由解析。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。