更新:
我通过使用ActionConstraint找到了解决方案.您必须添加有关重复操作的自定义Action Constraint属性.
重复索引方法的示例.
第一个家庭控制器
namespace WebApplication.Controllers { public class HomeController : Controller { [NamespaceConstraint] public IActionResult Index() { return View(); } } }
第二个HomeController
namespace WebApplication { public class HomeController : Controller { [NamespaceConstraint] public IActionResult Index() { return View(); } } }
配置路由
app.UseMvc(cR => cR.MapRoute("default", "{controller}/{action}", null, null, new { Namespace = "WebApplication.Controllers.HomeController" }));
行动约束
namespace WebApplication { public class NamespaceConstraint : ActionMethodSelectorAttribute { public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action) { var dataTokenNamespace = (string)routeContext.RouteData.DataTokens.FirstOrDefault(dt => dt.Key == "Namespace").Value; var actionNamespace = ((ControllerActionDescriptor)action).MethodInfo.DeclaringType.FullName; return dataTokenNamespace == actionNamespace; } } }
第一个答案:
属性路由是否会影响app.UseMvc()定义的路由?
属性路由和基于约定的路由(routes.MapRoute(...
)独立工作.属性路由优于常规路由.
但它似乎没有做我想要的.有没有办法将路由引擎限制到某个命名空间?
开发人员回答:
我们建议使用区域,而不是使用命名空间列表来对控制器进行分组.您可以将控制器(无论它们位于哪个组件中)与特定区域相关联,然后为该区域创建路径.
您可以在此处看到一个测试网站,其中显示了在MVC 6中使用区域的示例:https://github.com/aspnet/Mvc/tree/dev/test/WebSites/RoutingWebSite.
使用具有基于约定的路由的Area的示例
控制器:
//Reached through /admin/users //have to be located into: project_root/Areas/Admin/ [Area("Admin")] public class UsersController : Controller { }
配置基于约定的路由:
app.UseMvc(routes => { routes.MapRoute( "areaRoute", "{area:exists}/{controller}/{action}", new { controller = "Home", action = "Index" }); }
使用具有基于属性的路由的Area的示例
//Reached through /admin/users //have to be located into: project_root/Areas/Admin/ [Area("Admin")] [Route("[area]/[controller]/[action]", Name = "[area]_[controller]_[action]")] public class UsersController : Controller { }