2017年6月11日 星期日

[ASP.NET Core] Routing

 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.


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




沒有留言:

張貼留言