ASP.NET Core Routing Attribute Routing
▌Introduction
We will learn how to set routing in ASP.NET Core MVC,
including of
1.
Template and defaults
2.
Catch-all
3.
Constraint
4.
Custom constraint
5.
Attribute routing
▌Environment
▋.NET Core 2.0.0 preview 1
▌Template and Defaults
After we create a ASP.NET Core MVC template, we will find
the default routing in Startup.cs : Configure method as
following
app.UseMvc(
routes => {
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
|
Which
equals (Skip app.UseMvc)
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}",
defaults: new { controller =
"Home", action = "Index" });
|
▋Result
/Products/Details/13 => OK
/Products/Details/toy
=> OK
/Products/Index/ => OK
▌Catch-all
▋Routing sample
routes.MapRoute(
name: "help",
template: "HelpMe/{*question}",
defaults: new { controller = "Home", action = "Help" });
|
And here is the MVC Controller.
public IActionResult Help(string question)
{
ViewBag.Question = question;
return View();
}
|
▋Result
▌Constraint
▋Routing sample
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id:int}");
|
▋Result
/Products/Details/13 => OK
/Products/Details/toy
=> 404
/Products/Index/ => 404
How about
template: "{controller=Home}/{action=Index}/{id:int?}"); ?
You can have a try.
You can have a try.
Here are some standard Constraints for routing. See more
details on docs.microsoft.com.
Type
|
Constraint
|
Example
|
String
|
minlength
|
{id:minlength(5)}
|
maxlength
|
{id:maxlength(10)}
|
|
length
|
{id:length(7)}
{id:length(5,
10)}
|
|
Integer
|
min
|
{age:min(18)}
|
max
|
{age:max(65)}
|
|
range
|
{age:range(18,
65)}
|
|
Regular expression
|
regex(expression)
|
▋Routing sample
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id:min(10)}");
|
▋Result
/Products/Details/13
=> OK
/Products/Details/5
=> 404
/Products/Details
=> 404
/Products/Details/15.5
=> 404
If we need two or more constraints on a routing, write
the route like this,
template: "{controller=Home}/{action=Index}/{id:min(10):max(20)}");
▋Custom constraint
Step 1. Implement IRouteConstraint
Step 2. Register custom constraint
▋Create custom routing class
public class CustomRouteConstraint : IRouteConstraint
{
private readonly string[] constraints = new string[]{"peter","jack","mary"};
public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
{
object value;
if (values.TryGetValue(routeKey, out value) && value != null)
{
return
constraints.Contains(value.ToString().ToLower());
}
return false;
}
}
|
▋Register custom routing in Startup.cs
public void ConfigureServices(IServiceCollection services)
{
//Register custom routing
services.AddRouting(options =>
options.ConstraintMap.Add("Custom", typeof(CustomRouteConstraint)));
}
|
▋Use custom constraint
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id:Custom}");
|
▋Result
/Home/Index/Peter
=> OK
/Home/Index/MARY
=> OK
/Home/Index/Steven
=> 404
/Home/Index => 404
▌Attribute Routing
▋Routing sample
[Route("[controller]/[action]/{name:Custom}")]
public IActionResult Index(string name)
{
_logger.Debug($"Name={name}");
return View();
}
|
▌Reference