Introduction
Important change to make in RouteConfig.cs
By default Attribute based routing is disabled in ASP.NET MVC. In order to enable it, we need to call
MapMvcAttributeRoutes
method of the RouteCollection object. public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// important to work with AttributeRouting in our RoutingStuffsController.cs
routes.MapMvcAttributeRoutes();
}
Calling
above method instruct the routing system to inspect the Routing
attributes in the controller classes apart from RouteConfig.cs settings.
Implementing Attribute Routing
To implement Attribute Routing, we use Route[] attribute in the action method of the controller.
[Route("ITFunda")]
public ActionResult AttributeRouting()
{
return View("/Views/RoutingStuffs/ITFunda.cshtml");
}
In
the above code snippet, we have specified pattern of url to route to
this action method of the controller. When we run our program and hit
the url like below
- http://localhost:63087/ITFunda
We see the /Views/RoutingStuffs/ITFunda.cshtml page as output in the browser.
Using Attribute Routing with Segment variables
Apart from just static URL (ITFunda), we can also mix string that contains static text as well as segment variables like this.
[Route("ITFunda/Show/{course}")]
public ActionResult AttributeRoutingParams(string course)
{
ViewBag.Course = course;
return View("/Views/RoutingStuffs/ShowCourse.cshtml");
}
In this case, if we browser the application with below url- http://localhost:63087/ITFunda/Show/ASPDOTNET
We
get ShowCourse.cshtml page with course variable value as "ASPDOTNET".
Remember that the segment variables name and action method parameter
names must match to get the data from the url segment.
Constraining the segment variables
We can also constrain the segment variables like this
[Route("ITFunda/Show/{course:int}")]
In this case, course segment must pass an integer value otherwise we get 404 error. So the correct url should look like http://localhost:63087/ITFunda/Show/10 not http://localhost:63087/ITFunda/Show/somestring
NOTE that we also need to change the corresponding action method parameter type.
Using RoutePrefix in the Controller class
We
can also use RoutePrefix attribute in the controller class to define a
common prefix to apply on all routes defined in the action methods of
the controller.
[RoutePrefix("IT")]
public class RoutingStuffsController : Controller
{
[Route("ITFunda")]
// UnComment the RouteConfig.cs - MapMvcAttributeRoutes();
public ActionResult AttributeRouting()
{
return View("/Views/RoutingStuffs/ITFunda.cshtml");
}
}
After implementing RoutePrefix, the correct url would look like
- http://localhost:63087/IT/ITFunda
Notice the /IT before /ITFunda because RoutePrefix is "IT".
Conclusion
Attribute
based routing on one hand give flexibility to control the routing even
at the controller level however on the other hand it defeats the ASP.NET
MVC core purpose that is separation of concern. The routing mechanism
is mixed in RouteConfig as well as Controller. With that said, the
flexibility takes over and give us excellent control over URL
management.
Hope you liked this article, do subscribe to the RSS feed at the top and let me know your feedback or comment.
Thanks
No comments:
Post a Comment