7

我在主/顶部区域有一个联系人控制器,我有一个名为“联系人”的区域。

如果我在注册顶级路由之前注册我的区域,我会收到 POST 404 到联系人控制器:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        ModelBinders.Binders.DefaultBinder = new NullStringBinder();
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }

而且,如果我在路由之后注册我的区域,我的联系人控制器的 404 将消失,但我到联系人区域的路由现在是 404。

...记录了许多重复的控制器名称问题,但我还没有找到该区域与控制器名称相同的特定场景。

...可能很容易解决。非常感谢帮助。:-D

fwiw,我正在使用显式命名空间注册我的联系人区域:

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

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

2 回答 2

24

有两点需要考虑

  1. Application_Start()方法中首先注册区域AreaRegistration.RegisterAllAreas();

  2. 如果名称冲突,请使用App_Start文件夹的RouteConfig.cs文件中的命名空间以及路由中定义的所有路由(如ContactsAreaRegistration.cs

为了复制您的场景,我创建了一个示例应用程序,并且能够成功访问下面给出的两个 URL:

http://localhost:1200/联系人/索引

http://localhost:1200/Contacts/contacts/Index

我的应用程序的结构如下所示:

在此处输入图像描述

ContactsAreaRegistration.cs文件中,我们有以下代码:

公共类 ContactsAreaRegistration : AreaRegistration
    {
        公共覆盖字符串 AreaName
        {
            得到
            {
                返回“联系人”;
            }
        }

        公共覆盖无效RegisterArea(AreaRegistrationContext上下文)
        {
            上下文.MapRoute(
                "Contacts_default",
                "联系人/{controller}/{action}/{id}",
                新的 { action = "索引", id = UrlParameter.Optional },
                命名空间:新[] {“MvcApplication1.Areas.Contacts.Controllers”}
            );
        }
    }

希望它会帮助你。如果您需要,我可以发送我创建的示例应用程序代码。谢谢。

于 2013-11-15T19:14:17.270 回答
0

对于 MVC5,我做了@Snesh 所做的事情,但这并没有完全奏效。如果它们具有相同的名称,它只会解析我所在区域的控制器,而不是项目根目录中的控制器。我最终不得不将命名空间指定为我的RegisterArea方法和RegisterRoutes方法中的参数RouteConfig.cs

路由配置.cs

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

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            // This resolves to the Controllers folder at the root of the web project
            namespaces: new [] { typeof(Controllers.HomeController).Namespace }
        );
    }

区域注册.cs

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Handheld_default",
            "Handheld/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { typeof(Areas.Handheld.Controllers.HomeController).Namespace }
        );
    }
于 2018-08-13T19:21:39.067 回答