Reputation: 111
I need to add one 'pathname' prior to some controllers in order to clarify their purpose.
For example, currently:
/news/create
,
/news/edit
,
/event/create
,
/event/edit
,
I wish their router could be
/request/news/create
,
/request/news/edit
,
/request/event/create
,
/request/event/edit
I tried to add the following code in RouteConfig.cs
routes.MapRoute(
name: "Api",
url: "request/{controller}/{action}/{id}",
defaults: new { id = UrlParameter.Optional }
);
One of controllers EventController.cs
public class EventController : Controller{
[HttpPost]
public ActionResult Edit(int id, Events eventModel){
//code
}
[HttpPost]
public ActionResult Create(Events eventModel){
//code
}
}
Here I meet a problem:
/request/event/create
404 error
/request/event/edit/1
works!
/event/create
works!
/event/edit/1
works!
So, my question is why /request/event/create
doesn't work and how to fix that?
As far as I know, adding [Route("request/event/create")]
above Create action could make it work.
---------Update--------
RouteConfig.cs
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Index", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Api",
url: "request/{controller}/{action}/{id}",
defaults: new { id = UrlParameter.Optional }
);
}
}
Upvotes: 1
Views: 1773
Reputation: 246998
Order of registered routes is important. Move more specific routes to before general routes
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Api",
url: "request/{controller}/{action}/{id}",
defaults: new { id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Index", action = "Index", id = UrlParameter.Optional }
);
}
}
Upvotes: 2