ASP.NET MVC 5路由限制

本文关键字:路由 NET MVC ASP | 更新日期: 2023-09-27 18:17:24

我已经按照建议更新了我的代码来使用Area,但问题仍然存在。/dashboard仍然可用

我的Controllers文件夹中有HomeController和AccountController。我有Areas/Admin/Controllers/DashboardController.cs

问题:

  1. 我的区域管理控制器可以像这样访问/admin/dashboard,但问题是它也可以使用/dashboard ->访问,这应该显示404
这是我的RouteConfig:
routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "project.Controllers" }
            );

AdminAreaRegistration:

public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "project.Areas.Admin.Controllers" }
            );
        }

ASP.NET MVC 5路由限制

/dashboard呼叫按照Default路由规则路由。

您可以通过添加约束使Default不处理对dashboard控制器的调用。

例如:

在默认路由规则中,您可以添加如下约束:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    namespaces: new[] { "project.Controllers" },
    constraints: new { controller = new Constraints.IsNotDashboard() }
);

然后,您可以这样声明约束:

using System.Web;
using System.Web.Routing;
public class IsNotDashboard : IRouteConstraint
{
    public IsNotDashboard()
    {
    }
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        string controller = values["controller"].ToString().ToLower();
        return controller != "dashboard";
    }
}

有了这个约束,所有匹配dashboard控制器的调用都不会被Default路由规则处理。

谢谢大家。

在网上搜索之后,我终于找到了最适合我问题的方法。

问题是所有控制器都在Default路由中被处理,所以我只是在Default中添加了控制器约束。这样Default路由将只接受指定控制器上的请求。下面是我的新RouteConfig

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                constraints: new { controller = @"(Account|Manage|Home)" }
            );