<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      .NetCore MVC中的路由(2)在路由中使用約束

      .NetCore MVC中的路由(2)在路由中使用約束


      0x00 路由模板中的約束

      在配置路由模板時,除了以靜態(tài)字符和變量的形式外,還可以通過配置對變量進行約束。實際如果不嫌麻煩的話在路由到的Action中對變量進行檢查也是一種方法,不過對于變量的通用的約束當然是放在路由層面更加合適。而且這樣做會簡化Action的代碼,使Action更加專注于自身業(yè)務,符合AOP的思路。這篇文章主要介紹路由模板中的約束。


      0x01 在路由模板中使用約束

      在路由模板中使用約束是很簡單的,如下所示:

      {controller=Home}/{action=Index}/{id:int?}

      這個模板就對id進行了約束,約束是通過冒號(:)實現(xiàn)的,冒號后為約束的內容。Int?代表id約束為int?類型,只有id能被轉換為int?類型模板匹配才算成功。即使用int.TryParse()方法返回true

      Home/Index/123匹配成功,id123

      Home/Index/abc 匹配失敗,因為abc無法轉換為int?

      Home/Index匹配成功,此時idnull

      和配置默認值一樣,除了直接在模板中配置外,也可以在MapRoute方法中通過傳入參數(shù)進行配置:

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

      效果是一樣的。

      如果我們要對一個變量使用多個約束,只需要在約束后面繼續(xù)用冒號加約束即可。例如

      {controller=Home}/{action=Index}/{id:int:min(0)}

      這個模板中id被約束為int類型且最小值為0。同樣的也可以以參數(shù)的方式配置:

      routes.MapRoute(
          name: "default",
          template: "{controller}/{action}/{id?}",
          defaults: new
          {
              controller = "Home",
              action = "Index",
          },
          constraints: new
          {
              id = new CompositeRouteConstraint(
                  new IRouteConstraint[]
                  {
                      new IntRouteConstraint(),
                      new MinRouteConstraint(0)
                  })
      });

      可以達到同樣的效果,不過直接寫到模板更加簡潔和直觀。

      0x02 .NetCore MVC中內建的約束

      .NetCore MVC中內建了大量的約束可供使用。其中大多數(shù)基于類型的約束都是使用該類型的TryParse()來嘗試轉換變量提取出來的字符串,返回ture則通過約束,返回false違反約束。

      1.約束為intint,對應的類為IntRouteConstraint

      例子:{controller=Home}/{action=Index}/{id:int }”

      2.約束為floatfloat,對應的類為FloatRouteConstraint

      例子:{controller=Home}/{action=Index}/{id:float }”

      3.約束為longlong,對應的類為LongRouteConstraint

      例子:{controller=Home}/{action=Index}/{id:long}”

      4.約束為doubledouble,對應的類為DoubleRouteConstraint

      例子:{controller=Home}/{action=Index}/{id:double }”

      5.約束為decimaldecimal,對應的類為DecimalRouteConstraint

      例子:{controller=Home}/{action=Index}/{id:decimal }”

      6.約束為布爾值:bool,對應的類為BoolRouteConstraint

      例子:{controller=Home}/{action=Index}/{id:bool}”

      7.約束為字母:alpha,對應的類為AlphaRouteConstraint

      例子:{controller=Home}/{action=Index}/{id:alpha}”

      8.約束為時間日期:datetime,對應的類為DateTimeRouteConstraint

      例子:{controller=Home}/{action=Index}/{id:datetime}”

      9.約束為GUIDguid,對應的類為GuidRouteConstraint

      例子:{controller=Home}/{action=Index}/{id:bool}”


      10.約束長度:length(len),對應的類為LengthRouteConstraint(len)

      例子:{controller=Home}/{action=Index}/{id:length(5) }”

      11.約束最小長度:minlength(len),對應的類為MinLengthRouteConstraint(len)

      例子:{controller=Home}/{action=Index}/{id:minlength(5)}”

      12.約束最大長度:maxlength(len),對應的類為MaxLengthRouteConstraint(len)

      例子:{controller=Home}/{action=Index}/{id:maxlength(10)}”

      13.約束長度范圍:length(min,max),對應的類為LengthRouteConstraint(min,max)

      例子:{controller=Home}/{action=Index}/{id:length(5,10)}”


      14.約束最小值:min(v),對應的類為MinRouteConstraint(v)

      例子:{controller=Home}/{action=Index}/{id:min(0)}”

      15.約束最大值:max(v),對應的類為MaxRouteConstraint(v)

      例子:{controller=Home}/{action=Index}/{id:max(1000)}”

      16.約束范圍:range(min,max),對應的類為RangeRouteConstraint(min,max)

      例子:{controller=Home}/{action=Index}/{id:range(0,1000) }”


      17.約束正則表達式:regex(exp),對應的類為RegexRouteConstraint(exp)

      例子:{controller:regex(^My.*)=Home }/{action=Index}/{id?}”

      0x03 創(chuàng)建自定義約束

      除了使用內建的約束外,還可以自定義約束。只要實現(xiàn)IRouteConstraint接口即可。這個接口定義了一個方法:

      bool Match(
          HttpContext httpContext,   //Http上下文信息
          IRouter route,            //當前正在測試的模板信息
          string routeKey,           //當前正在測試約束的變量名稱
          RouteValueDictionary values, //模板中變量提取出的值
          RouteDirection routeDirection) //路由方向,枚舉,值包括IncominRequestg和UrlGeneration

      這個方法返回ture說明符合約束,返回false說明違反約束。下面我們通過實現(xiàn)這個接口定義一個約束,把id約束為偶數(shù)。

      public class EvenRouteConstraint : IRouteConstraint
      {
          public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
          {
              int id;
              if (!int.TryParse(values[routeKey].ToString(), out id))
                  return false;
                  
              return id % 2 == 0;
          }
      }

      然后這樣配置路由來約束id:

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

      這樣配置后

      Path路由到HomeControllerIndex,id為空

      Home/Index/12路由到HomeControllerIndexid12,是偶數(shù)

      Home/Index/13匹配失敗,id13,不是偶數(shù)。

      除了使用constraints參數(shù)添加自定義路由約束外,也可以把自定義路由約束映射為字符串,用于路由模板中。

      public void ConfigureServices(IServiceCollection services)
      {
              services.Configure<RouteOptions>(options=>
              {
                  options.ConstraintMap.Add("even",typeof(EvenRouteConstraint));
              });
              // Add framework services.
              services.AddMvc();
      }

      這樣配置后路由模板寫成:

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

      可以達到同樣的效果。把約束映射為字符串后,還可以方便的在Route特性中使用,例如:

      [Route("durow/Test/[action]/{id:even?}")]

      0x04 相關代碼 

      https://github.com/durow/NetCoreStudy/tree/master/src/RouteStudy 

       


      更多內容歡迎訪問我的博客:http://www.durow.vip

      posted @ 2016-10-30 12:27  durow  閱讀(2792)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 高清无码爆乳潮喷在线观看| 亚洲综合一区二区三区在线| 国产高清国产精品国产专区| 国产精品 视频一区 二区三区| 噜噜噜噜私人影院| 中文字幕有码在线第十页| 久久综合伊人77777| 偷看少妇自慰xxxx| 国产精品久久露脸蜜臀| 色狠狠色婷婷丁香五月| 日本不卡一区| 国产精品中文字幕第一页| 日韩精品有码中文字幕| 免费大片av手机看片高清| 精品人妻中文字幕有码在线| 亚洲人成色99999在线观看| 熟女少妇精品一区二区| 色悠悠久久精品综合视频| 东京一本一道一二三区| 陵水| 国产精品亚洲专区无码导航| 亚洲人成电影在线天堂色| 常宁市| 国产 浪潮av性色四虎| 亚洲高清乱码午夜电影网| 2021国产精品一卡2卡三卡4卡| 亚洲国内精品一区二区| 亚洲最大的熟女水蜜桃AV网站| 四虎国产精品永久在线下载| 久久精品午夜视频| 日韩剧情片电影网站| 国产卡一卡二卡三免费入口| 精品国产精品国产偷麻豆| 国产精品视频午夜福利| 精品国产免费一区二区三区香蕉| 人妻少妇88久久中文字幕| 国产 麻豆 日韩 欧美 久久| 老司机性色福利精品视频| 国产av亚洲一区二区| 蜜桃AV抽搐高潮一区二区| 男人扒开添女人下部免费视频|