最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ASP.NET Core中自定義路由約束的實(shí)現(xiàn)

 更新時(shí)間:2019年03月25日 09:27:34   作者:weilence  
這篇文章主要介紹了ASP.NET Core中自定義路由約束的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

路由約束

ASP.NET Core中,通過定義路由模板,可以在Url上傳遞變量,同時(shí)可以針對變量提供默認(rèn)值、可選和約束。

約束的使用方法是在屬性路由上添加指定的約束名,用法如下:

// 單個(gè)使用
[Route("users/{id:int}")]
public User GetUserById(int id) { }
// 組合使用
[Route("users/{id:int:min(1)}")]
public User GetUserById(int id) { }

框架內(nèi)部已經(jīng)提供了一些約束,如下所示:

約束 示例 匹配項(xiàng)示例 說明
int {id:int} 123456789, -123456789 匹配任何整數(shù)
bool {active:bool} true, FALSE 匹配 true或 false(區(qū)分大小寫)
datetime {dob:datetime} 2016-12-31, 2016-12-31 7:32pm 匹配有效的 DateTime 值(位于固定區(qū)域性中 - 查看警告)
decimal {price:decimal} 49.99, -1,000.01 匹配有效的 decimal 值(位于固定區(qū)域性中 - 查看警告)
double {weight:double} 1.234, -1,001.01e8 匹配有效的 double 值(位于固定區(qū)域性中 - 查看警告)
float {weight:float} 1.234, -1,001.01e8 匹配有效的 float 值(位于固定區(qū)域性中 - 查看警告)
guid {id:guid} CD2C1638-1638-72D5-1638-DEADBEEF1638, {CD2C1638-1638-72D5-1638-DEADBEEF1638} 匹配有效的 Guid 值
long {ticks:long} 123456789, -123456789 匹配有效的 long 值
minlength(value) {username:minlength(4)} Rick 字符串必須至少為 4 個(gè)字符
maxlength(value) {filename:maxlength(8)} Richard 字符串不得超過 8 個(gè)字符
length(length) {filename:length(12)} somefile.txt 字符串必須正好為 12 個(gè)字符
length(min,max) {filename:length(8,16)} somefile.txt 字符串必須至少為 8 個(gè)字符,且不得超過 16 個(gè)字符
min(value) {age:min(18)} 19 整數(shù)值必須至少為 18
max(value) {age:max(120)} 91 整數(shù)值不得超過 120
range(min,max) {age:range(18,120)} 91 整數(shù)值必須至少為 18,且不得超過 120
alpha {name:alpha} Rick 字符串必須由一個(gè)或多個(gè)字母字符(a-z,區(qū)分大小寫)組成
regex(expression) {ssn:regex(^\d{{3}}-\d{{2}}-\d{{4}}$)} 123-45-6789 字符串必須匹配正則表達(dá)式(參見有關(guān)定義正則表達(dá)式的提示)
required {name:required} Rick 用于強(qiáng)制在 URL 生成過程中存在非參數(shù)值

內(nèi)置的約束能夠適用于大部分常見的應(yīng)用場景,但是有時(shí)候我們還是需要去自定義我們想要的效果。

自定義路由約束

自定義約束是要實(shí)現(xiàn) IRouteConstraint 接口,然后重載 Match 方法,該方法有四個(gè)參數(shù)。

第一個(gè)參數(shù) httpContext 是當(dāng)前請求的上下文

第二個(gè)參數(shù) route 是當(dāng)前約束所屬的路由

第三個(gè)參數(shù) routeKey 是當(dāng)前檢查的變量名,例如文章開頭示例中的 id

第四個(gè)參數(shù) values 是當(dāng)前Url匹配的字典值,例如文章開頭的示例的路由,如果Url是 users/1 ,那么就有一個(gè)字典,其 key = id , value = 1 。當(dāng)然還有其他的變量的值,比如 controller , action 等。

第五個(gè)參數(shù) routeDirection 是一個(gè)枚舉值,代表是web請求的還是用 Url.Action 等方法生成Url。

舉一個(gè)實(shí)例,我們想要定義一個(gè)約束,指定路由傳過來的參數(shù)必須是指定的枚舉值。

我們先定義一個(gè)枚舉:

public enum BoolEnum
{
  True,
  False
}

然后定義約束:

public class EnumConstraint : IRouteConstraint
{
  private Type _enumType;

  public EnumConstraint(string enumTypeName)
  {
    _enumType = Type.GetType(enumTypeName);
  }

  public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
  {
    var value = values[routeKey];
    if (value == null)
    {
      return false;
    }

    if (Enum.TryParse(_enumType, value.ToString(), out object result))
    {
      if (Enum.IsDefined(_enumType, result))
      {
        return true;
      }
    }

    return false;
  }
}

在 Startup.cs 的 ConfigureServices 方法添加自定義約束:

services.Configure<RouteOptions>(options =>
{
  options.ConstraintMap.Add("enum", typeof(EnumConstraint));
});

在路由上使用約束:

( WebApplicationTest 是當(dāng)前的 namespace )

[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
  // GET: api/Test
  [HttpGet("{bool:enum(" + nameof(WebApplicationTest) + "." + nameof(BoolEnum) + ")}")]
  public string Get(BoolEnum @bool)
  {
    return "bool: " + @bool;
  }

  [HttpGet("{id:int:min(2)}", Name = "Get")]
  public string Get(int id)
  {
    return "id: " + id;
  }

  [HttpGet("{name}")]
  public string Get(string name)
  {
    return "name: " + name;
  }
}

{id:int:min(2)} 路由必須使用 min(2) ,否則對于 id = 0 或 id = 1 會(huì)有沖突。

運(yùn)行程序,當(dāng)路由是 api/Test/0 、 api/Test/1 、 api/Test/True 和 api/Test/False 的時(shí)候,匹配我們的自定義約束。

當(dāng)路由是 api/Test/{大于2的整數(shù)} 的時(shí)候,匹配第二個(gè)路由。

其他情況匹配第三個(gè)路由。

結(jié)論

路由約束在某些場景下是非常有用的功能,可以減少 controller 中校驗(yàn)參數(shù),將部分參數(shù)校驗(yàn)的功能使用聲明式的 attruibute 來實(shí)現(xiàn),某些重復(fù)的校驗(yàn)可以通過抽取成約束公共使用。

constraint 的構(gòu)造函數(shù)可以使用注入,所以可以擴(kuò)展性十分強(qiáng),可以通過查詢數(shù)據(jù)庫做一些參數(shù)校驗(yàn)。

官網(wǎng)上對于路由約束只是簡單的提了一下,本文對路由約束的使用提供了具體的示例。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • c#中兩種不同的存儲(chǔ)過程調(diào)用與比較

    c#中兩種不同的存儲(chǔ)過程調(diào)用與比較

    存儲(chǔ)過程的調(diào)用在B/S系統(tǒng)中用的很多。傳統(tǒng)的調(diào)用方法不僅速度慢,而且代碼會(huì)隨著存儲(chǔ)過程的增多不斷膨脹,難以維護(hù)。新的方法在一定程度上解決了這些問題
    2012-12-12
  • asp.net Repeater之非常好的數(shù)據(jù)分頁

    asp.net Repeater之非常好的數(shù)據(jù)分頁

    asp.net Repeater之非常好的數(shù)據(jù)分頁實(shí)現(xiàn)代碼。
    2009-07-07
  • .NET8.0發(fā)布到IIS的實(shí)現(xiàn)步驟

    .NET8.0發(fā)布到IIS的實(shí)現(xiàn)步驟

    很多學(xué)習(xí).Net的朋友初次接觸并不知道一個(gè).Net應(yīng)用怎么發(fā)布到IIS服務(wù)器中去,本文主要介紹了.NET8.0發(fā)布到IIS的實(shí)現(xiàn)步驟,感興趣的可以了解一下
    2024-05-05
  • 詳解ASP.NET頁面生命周期

    詳解ASP.NET頁面生命周期

    這篇文章主要為大家介紹了ASP.NET頁面生命周期,熟悉頁面生命周期非常重要,這樣我們才能在生命周期的合適階段編寫代碼,需要的朋友可以參考下
    2015-12-12
  • ASP.NET?Core使用自定義日志中間件

    ASP.NET?Core使用自定義日志中間件

    這篇文章介紹了ASP.NET?Core使用自定義日志中間件的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • .NET操作Excel實(shí)例分享

    .NET操作Excel實(shí)例分享

    這篇文章主要介紹了.NET操作Excel實(shí)例,有需要的朋友可以參考一下
    2014-01-01
  • Debian 8或Debian 9(64 位)安裝 .NET Core

    Debian 8或Debian 9(64 位)安裝 .NET Core

    這篇文章主要為大家詳細(xì)介紹了Debian 8或Debian 9(64 位)安裝 .NET Core,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • ASP.NET MVC中分部視圖的應(yīng)用方法

    ASP.NET MVC中分部視圖的應(yīng)用方法

    這篇文章主要給大家介紹了關(guān)于ASP.NET MVC中分部視圖的應(yīng)用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • ASP.NET 運(yùn)行時(shí)錯(cuò)誤: 沒有為擴(kuò)展名“.asax”注冊的生成提供程序修正版

    ASP.NET 運(yùn)行時(shí)錯(cuò)誤: 沒有為擴(kuò)展名“.asax”注冊的生成提供程序修正版

    ASP.NET 運(yùn)行時(shí)錯(cuò)誤: 沒有為擴(kuò)展名“.asax”注冊的生成提供程序??梢栽?machine.config 或 web.config 中的 <compilation><buildProviders> 節(jié)注冊一個(gè)。
    2009-01-01
  • UpdatePanel和jQuery不兼容 局部刷新jquery失效

    UpdatePanel和jQuery不兼容 局部刷新jquery失效

    在做項(xiàng)目中發(fā)現(xiàn),在使用了UpdatePanel的地方,局部刷新后,jquery失效了,后來經(jīng)過搜索找到不錯(cuò)的解決方法,在此與大家分享下,有類似問題的朋友可以參考下
    2013-09-09

最新評論

黄平县| 泰宁县| 苍溪县| 鹤峰县| 洛阳市| 陆丰市| 怀柔区| 固安县| 青岛市| 广宗县| 奈曼旗| 延吉市| 旺苍县| 揭西县| 扶风县| 巴马| 晋州市| 广德县| 涡阳县| 常山县| 静安区| 通榆县| 札达县| 衡东县| 苏尼特右旗| 牟定县| 漯河市| 拜城县| 宽甸| 筠连县| 内丘县| 新宁县| 石柱| 南投市| 仙游县| 定结县| 诸城市| 察隅县| 手游| 登封市| 从江县|