【问题标题】:How to prevent controllers in wrong areas from being used in MVC5MVC5中如何防止错误区域的控制器被使用
【发布时间】:2015-10-30 20:39:26
【问题描述】:

我的 MVC 应用程序在根/全局级别设置了控制器。这些没有明确的区域。我也有一个“管理”区域。以 /admin/ 开头的 URL 被路由到管理区域中的匹配控制器。其他 URL 被路由到匹配的全局控制器。这在大多数情况下都可以正常工作。

我遇到的问题是,如果 URL 与管理区域中的控制器匹配,而全局区域中不存在同名之一,则请求被错误地路由到管理区域中的控制器.我知道这种情况正在发生,因为我在相关控制器中的匹配操作上放置了一个断点。

例如,我在管理区域中有一个名为 CalendarController 的控制器。当我访问/admin/calendar 时,它可以工作,因为它在Areas/Admin/Views/Calendar/Index.cshtml 中找到了动作和相应的视图。当我访问/calendar 时出现问题。我在根级别没有名为 Calendar 的控制器,但由于某种原因,它将请求路由到管理区域的 CalendarController,这是我不想要的。我希望它返回 404,因为在根级别不存在 CalendarController。相反,我收到一个错误,因为它正在根级别(/Views/Calendar/Index.cshtml)搜索视图,即使匹配的控制器位于管理区域中。

我如何防止在管理区域搜索匹配的控制器,除非 URL 中包含 /admin?

这是相关的路由代码,除了命名空间之外,基本上都是库存的。如果没有命名空间,问题仍然会发生。实际应用中有更多路由,但我在一个全新的 MVC 项目中得到了相同的行为。

public class AdminAreaRegistration : AreaRegistration 
{
    public override string AreaName 
    {
        get 
        {
            return "Admin";
        }
    }

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

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

在此屏幕截图中,我所说的“根级别”控制器是Controllers/HomeController。我希望不以 /admin 开头的 URL 只查看这些控制器。问题是它Areas/Admin/Controllers 中搜索。

【问题讨论】:

  • 没关系!您收到此消息是因为服务器无法在任何地方找到 Index。
  • @Auguste - 这不是问题的重点
  • @Auguste 并非我的所有管理员控制器都在根级别具有匹配的控制器,因此我必须制作一堆虚拟控制器才能使其工作。除非 URL 以 admin/ 开头,否则我希望它只搜索根级别的控制器,如果找不到匹配项则放弃,而不是继续搜索这些区域。
  • @Sam - 您可能会在这里找到答案:stackoverflow.com/questions/632964/…
  • @Sam 很确定它在 MVC 5 中,但是这个小宝石自 MVC 3 以来就一直存在 nuget.org/packages/AttributeRouting

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


【解决方案1】:

因此 MVC 路由引擎将在不同的命名空间中寻找匹配的控制器。您可以通过指定命名空间来解决此问题(就像您为管理区域所做的那样)。您还可以指定路由不使用 DataTokens 搜索其他命名空间。

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    namespaces: new [] { "AreaProblem.Controllers" }
    ).DataTokens["UseNamespaceFallback"] = false;

【讨论】:

  • 太棒了,这正是我想要的。谢谢!
猜你喜欢
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 2021-01-27
  • 2018-06-05
  • 2016-08-06
  • 1970-01-01
  • 2017-08-17
相关资源
最近更新 更多