MVC 5 AttributeRouting Catch All

依然范特西╮ 提交于 2019-12-10 02:06:25

问题


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.


回答1:


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 });
}



回答2:


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}"].




回答3:


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.



来源:https://stackoverflow.com/questions/22538574/mvc-5-attributerouting-catch-all

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!