天天看點

路由

建立路由

    路由提供了Route類作為IRouter的标準實作。當調用RouteAsync方法時,Route使用路由模闆文法定義比對URL路徑的模式,當調用GetVirtualPath方法時,Route會使用相同的路由模闆生成URL。

    大多數應用會通過調用MapRoute方法或定義在IRouteBuilder接口上的一個類似擴充方法來建立路由

    下面是兩個典型的ASP.NET。MVC路由例子

routes.MapRoute(
    name: "default_route",
    template: "{controller}/{action}/{id?}",
    defaults: new { controller = "Home", action = "Index" });

routes.MapRoute(
    name: "default_route",
    template: "{controller=Home}/{action=Index}/{id?}");      

使用路由中間件

    在使用路由前,需要添加依賴項 microsoft.aspnetcore.routing

   在Staup中添加路由到服務容器

public void ConfigureServices(IServiceCollection services)
{
       //添加路由服務
       services.AddRouting();
}      

   路由必須在Startup類Configure方法中配置

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
 {
           var trackPackageRouteHandler = new RouteHandler(context =>
             {
                 var routeVal = context.GetRouteData().Values;
                 return context.Response.WriteAsync($"Hello! Route values: {string.Join(", ", routeVal)}");
             });
            var routeBuilder = new RouteBuilder(app, trackPackageRouteHandler);
            routeBuilder.MapRoute(
                 "Track Package Route",
                  "package/{operation:regex(^track|create|detonate$)}/{id:int}"
             );
           //隻允許Get請求
            routeBuilder.MapGet("hello/{name}.{ext?}", context =>
             {
                 var name = context.GetRouteValue("name");
                 var ext = context.GetRouteValue("ext");
                 return context.Response.WriteAsync($"Hi,{name}.{ext}!");
             });

            var routes = routeBuilder.Build();
            app.UseRouter(routes);
}      

 響應清單

URI Response
/package/create/3 Hello! Route values: [operation, create], [id, 3]
/package/track/-3 Hello! Route values: [operation, track], [id, -3]
/package/track/-3/
/package/track/ <未通過,沒有比對>
GET /hello/Joe Hi, Joe!
POST /hello/Joe <未通過, 隻比對GET請求>
GET /hello/Joe/Smith

   架構提供了一系列的建立路由擴充方法

  • MapRoute
  • MapGet
  • MapPost
  • MapPut
  • MapDelete
  • MapVerb        

路由限制

限制 示例 比對示例 注釋

int

{id:int} 123 比對所有整型
bool {active:bool} true 比對 

true

 或 

false

datetime {dob:datetime} 2016-01-01 比對一個合法的 

DateTime

 值 (固定區域性 - 請看  options )
decimal {price:decimal} 49.99

decimal

 值
double {weight:double} 4.234

double

float {weight:float} 3.14

float

guid {id:guid} 7342570B-

Guid

long {ticks:long} 123456789

long

minlength(value) {username:minlength(5)} steve 至少5個字元串長。
maxlength(value) {filename:maxlength(8)} somefile 字元串不能超過8個字元長。
length(min,max) {filename:length(4,16)} Somefile.txt 字元串至少8個長度且不超過16個字元長度。
min(value) {age:min(18)} 19 值至少是18。
max(value) {age:max(120)} 91 值不能超過120。
range(min,max) {age:range(18,120)} 值必須介于18和120之間。
alpha {name:alpha} Steve 字元串必須是由字母字元組成。
regex(expression) {ssn:regex(^d{3}-d{2}-d{4}$)} 123-45-6789 字元串必須比對提供的正規表達式。
required {name:required} 用于在URL生成時強制必須存在值。

      驗證URL可轉為CLR類型(例如Int或DateTime)的路由限制總是使用固定區域性;它們認為URL是不可本地化的,架構提供的路由限制不會修改路由值,從URL解析過來的所有路由值都會存為字元串。例如,浮點路由限制會試圖将路由值轉換為一個浮點性,但轉換後的值隻用于驗證它是否能夠轉換為浮點型

上一篇: 功能接口
下一篇: a 強制換行

繼續閱讀