当前位置:  开发笔记 > 编程语言 > 正文

在ASP.NET Core中限制到控制器命名空间的路由

如何解决《在ASP.NETCore中限制到控制器命名空间的路由》经验,为你挑选了1个好方法。



1> Stas Boyarin..:

更新:

我通过使用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
{

}

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有