ASP.NET MVC 5路由限制
本文关键字:路由 NET MVC ASP | 更新日期: 2023-09-27 18:17:24
我已经按照建议更新了我的代码来使用Area,但问题仍然存在。/dashboard
仍然可用
我的Controllers文件夹中有HomeController和AccountController。我有Areas/Admin/Controllers/DashboardController.cs
问题:
- 我的区域管理控制器可以像这样访问
/admin/dashboard
,但问题是它也可以使用/dashboard
->访问,这应该显示404
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" }
);
}
/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)" }
);