MVC Areas - Non Area Route Resolves To Area

2019-04-26 22:36发布

问题:

I have added an area to my MVC 3 project. I cannot seem to get routing working with a very simple scenario. It seems to always want to resolve to the area. Here is my configuration. At startup:

AreaRegistration.RegisterAllAreas();
IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Browse", action = "Index", id = UrlParameter.Optional }

And

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 { controller = "Users", action = "Index", id = UrlParameter.Optional }
        );
    }
}

In web.config:

<authentication mode="Forms">
  <forms loginUrl="~/Login" defaultUrl="~/Browse" timeout="60" cookieless="UseDeviceProfile" />
</authentication>

I am using RouteDebugger to try to solve it. When I navigate to the Login page the debugger shows:

  • AppRelativeCurrentExecutionFilePath: ~Login
  • Admin/{controller}/{action}/{id} Does Not Match Current Request
  • {controller}/{action}/{id} Matches Current Request
  • Matched Route: {controller}/{action}/{id}

So far so good. But then it shows this:

  • Generated URL: /Admin/Login?ReturnUrl=%2F using the route "Admin/{controller}/{action}/{id}"

Next I log in. My Login/Index method is not hit, and the debugger shows:

  • AppRelativeCurrentExecutionFilePath: ~Login
  • Admin/{controller}/{action}/{id} Does Not Match Current Request
  • {controller}/{action}/{id} Matches Current Request
  • Matched Route: {controller}/{action}/{id}
  • Generated URL: /Admin/Login?ReturnUrl=%2FAdmin%2FLogin using the route "Admin/{controller}/{action}/{id}"

On the one hand it says that it does not match the Admin route, then in the generated URL it says it's using that route. I'm stumped.

回答1:

Try to add your area parameter with a predefined value to your routing definition... For example instead of:

context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { controller = "Users", action = "Index", id = UrlParameter.Optional }
        );

use:

context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { area = "Admin", controller = "Users", action = "Index", id = UrlParameter.Optional }
        );

Let me know if it helps... Regards