Update:
我通过使用 ActionConstraint 找到了解决方案。您必须添加有关重复操作的自定义操作约束属性。
具有重复索引方法的示例。
第一个家庭控制器
namespace WebApplication.Controllers
{
public class HomeController : Controller
{
[NamespaceConstraint]
public IActionResult Index()
{
return View();
}
}
}
第二个家庭控制器
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(...
)独立工作。并且属性路由比约定路由有优势。
但它似乎没有达到我想要的效果。有没有办法将路由引擎限制在某个命名空间?
开发商的答复 https://github.com/aspnet/Routing/issues/217#issuecomment-146598807:
我们建议使用区域,而不是使用命名空间列表来对控制器进行分组。您可以将控制器(无论它们位于哪个程序集中)归因于特定区域,然后为该区域创建路线。
您可以在此处查看一个测试网站,其中显示了在 MVC 6 中使用区域的示例:https://github.com/aspnet/Mvc/tree/dev/test/WebSites/RoutingWebSite https://github.com/aspnet/Mvc/tree/dev/test/WebSites/RoutingWebSite.
使用区域和基于约定的路由的示例
控制器:
//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" });
}
使用具有基于属性的路由的区域的示例
//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
{
}