【问题标题】:ASP.NET MVC 5 routing restrictionASP.NET MVC 5 路由限制
【发布时间】:2016-11-11 16:11:20
【问题描述】:

我已按照建议更新了代码以使用 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" }
            );

        }

【问题讨论】:

  • project.controllers.admin 命名空间在 project.controllers 命名空间内尝试将 admin 的命名空间更改为不是 project.controllers 的子命名空间。 project.admin 之类的东西,看看是否可行
  • 这听起来像是看看区域的好时机..

标签: c# asp.net asp.net-mvc url-routing


【解决方案1】:

/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路由规则处理。

【讨论】:

  • 约束有效,但是当我创建更多管理区域控制器时添加额外的约束非常乏味,因为它们也会被路由到默认值,对吗?
  • @HeeroYuy 您可以为所有新控制器设置一个约束。另一种方法是检查httpContext.Request.Url.LocalPath 属性,以及它是否以/admin 开头。如果这对您来说有点 hacky,请考虑使用默认情况下具有此行为的区域。
  • @HeeroYuy 我注意到你改变了你的问题,你现在正在使用区域。你还有这个问题吗?也许您的项目中有两个Dashboard 控制器?其中之一在该区域的命名空间之外
  • 我已经删除了区域外的仪表板控制器。但我已经找到了解决我的问题的方法。我在下面发了。谢谢:)
【解决方案2】:

谢谢大家。

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

问题是所有控制器都在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)" }
            );

【讨论】:

  • 您在constraints 中添加了相等检查。我们可以在constraints 中添加不等号吗? constraints: new { controller != @"(Account|Manage|Home)" } ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 2015-04-06
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
相关资源
最近更新 更多