Question

How do I create a catch all route with the new Attribute routing in MVC

I tried this: [Route("{pagenode}", Order = 999)]

But when I have a named route like [Route("contact"]

I get the "Multiple controller types were found that match the URL. This can happen if attribute routes on multiple controllers match the requested URL." error.

Was it helpful?

Solution 2

You can't do this with Attribute routing, do this the MVC4 way:

Map a route in your routemapper like this:

routes.MapRoute("RouteName","{*url}",new { controller = "YourFancyController", action = "YourAction" });

This will be your catch-all Route.

If you would like to map all the routes to their controller you can do this:

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

    routes.MapMvcAttributeRoutes();

    AreaRegistration.RegisterAllAreas();

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

OTHER TIPS

This can be done with Attribute Routing if the first "directory" in the path is fixed.

For example, to match anything that hits /questions or /questions/4 or /questions/answers/42 then you would use [Route("questions/{*catchall}"].

The ability to do this must have changed.

In my default controller, still called 'Home' I have one result method which I want executed for an unrecognised URL structure. The routing attribute is: [Route("{*catchall}")]. This is successfully executed for any old thing.

I have a second method which is always successfully executed based on its route (and I've thrown a few route 'styles' at it to see if it always works). I can only assume that the framework always registers the catch-all route last as this is the behaviour I'm seeing.

This is also a brand new, not configured (except for nuGet packages) MVC 5 project excepting that my methods have been changed to return JsonResult (not even doing their job yet but returning little anonymously typed objects). The catch-all for example returns: Json(new { Message = "Invalid Request" }, JsonRequestBehavior.AllowGet). Yes, yes I set the StatusCode first etc etc, this isn't about MY project ;).

I'm sure I haven't left anything out since there's so little to it but if any clarification is wanted I'll see about adding it.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top