MVC路由在根处拾取区域控制器

时间:2014-04-24 05:46:48

标签: c# .net asp.net-mvc-4

我在区域内的控制器遇到困难,这些控制器在不适合该区域的路线上应答请求。所以我有这样的设置(额外的东西削减):

/Areas/Security/Controllers/MembersController.cs
/Areas/Security/SecurityAreaRegistration.cs
/Controllers/HomeController.cs

我的安全区域已定义:

namespace MyApp.Web.Areas.Security
{
    public class SecurityAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "Security";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "Security_default",
                "Security/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

我的全球路由规则:

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("{*robotstxt}", new { robotstxt = @"(.*/)?robots.txt(/.*)?" });
        routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });

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

在我的全局asax中,我做了很多事情,但相关的部分是我调用AreaRegistration.RegisterAllAreas();然后我调用了执行上述操作的路由函数。

但我的问题是对“/ Members /”的请求正在使用我的“默认”路由命中我的会员控制器...即使控制器不在我指定的命名空间中。然后,当它试图运行时,它找不到它的视图,因为它们在区域中定义,并且它试图在整个视图文件夹中找到它们。我尝试制作路由命名空间"Weird.Namespace.With.No.Content"并且STILL命中成员控制器 - 我找不到任何方法使它不使用该控制器。如何让它不回答不在其区域内的请求?

3 个答案:

答案 0 :(得分:7)

通过将路线更改为:

结束寻找解决方案
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new string[] { "MyApp.Web.Controllers" }
    ).DataTokens["UseNamespaceFallback"] = false;

出于某种原因,由于某种原因,它似乎总能找到我的控制器,无论它们在哪里,完全忽略了我的名称空间 - 甚至来自其他引用的程序集。通过DefaultControllerFactory的ILSpy,看起来GetControllerType最终会回到绝对每个控制器的搜索状态,如果它没有在您要求的名称空间中找到控制器...

这个标志似乎是在我在特定区域制作的路线上自动设置的,而不是我在全局制作的路线上设置的。当我把它放在全球的时候,他们开始表现我原先的预期。我不知道你为什么要打开它......

答案 1 :(得分:1)

您也应该在您的区域注册名称空间。

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

然后确保所有控制器都在适当的命名空间中。

答案 2 :(得分:1)

您是否在注册主要路线后呼叫所有区域?

这是MVC模板的默认片段(请注意区域注册首先如何)

AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);