Paul
Paul

Reputation: 12799

MVC 4 routing "finding" controllers inside an Area

I have a MVC 4 WebSite with several Areas... I´m using all default routing created by VS2012...

So, I can access (from Area1) :

Area1/ControllerX/ActionX

I have some controllers without Area, so I can access :

ControllerY/ActionY

All fine... But, if I try to access the ControllerX without the Area1, like that :

ControllerX/ActionX

I got that error:

Exception: The view 'ActionX' or its master was not found or no view engine supports the
searched locations. The following locations were searched: ~/Views/mangavagao/ActionX.cshtml 
~/Views/Shared/ActionX.cshtml 
Controller: ControllerX
Action: ActionX

I was expecting a Not Found 404 error... Why is that route been captured ?

--

Area route:

context.MapRoute(
            "Area1_default",
            "Area1/{controller}/{action}/{id}",
            new { controller = "ControllerX", action = "ActionY", id = UrlParameter.Optional }
);

Default route:

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "ControllerY", action = "ActionY", id = UrlParameter.Optional     );

Upvotes: 2

Views: 2095

Answers (3)

shakib
shakib

Reputation: 5469

Add the namespaces parameter in the default maproute function. Then set the UseNamespaceFallback datatoken to false.

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    namespaces: new string[] { "MvcApplication.Controllers" }
    ).DataTokens["UseNamespaceFallback"] = false;
  1. namespaces parameter is set to prioritize the controller finding, when multiple controller with the same name exists.

  2. MVC will still search for controller outside of this namespace, if no match is found in the namespace.

  3. UseNamespaceFallback datatoken tells MVC to disregard the (2) statement.

hope this helps.

Upvotes: 5

Brent Mannering
Brent Mannering

Reputation: 2316

This is similar to this question: Not including area name in URL results in "The view 'Index' or its master was not found" instead of 404

In your case the namespaces need to be added to the default route, not the area route. The namespace in this case should not reference the area controllers. Something like this should work:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
    null, // object constraints
    new string[] { "Namespace.Application.Controllers" } // namespaces
);

Upvotes: 0

Henk Mollema
Henk Mollema

Reputation: 46541

Try to map the area route with a namespace:

context.MapRoute(
            "Area1_default",
            "Area1/{controller}/{action}/{id}",
            new { controller = "ControllerX", action = "ActionY", id = UrlParameter.Optional },
            new[] { "App.Areas.AreaName.Controllers" }
);

Change App and AreaName to the corresponding values.

Upvotes: 0

Related Questions