真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在ASP.NETCore中自定義路由約束-創(chuàng)新互聯(lián)

本篇文章給大家分享的是有關(guān)怎么在ASP.NET Core中自定義路由約束,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

廬陽(yáng)網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,廬陽(yáng)網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為廬陽(yáng)上千多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的廬陽(yáng)做網(wǎng)站的公司定做!

路由約束


ASP.NET Core中,通過(guò)定義路由模板,可以在Url上傳遞變量,同時(shí)可以針對(duì)變量提供默認(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)示例說(shuō)明
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字符串不得超過(guò) 8 個(gè)字符
length(length){filename:length(12)}somefile.txt字符串必須正好為 12 個(gè)字符
length(min,max){filename:length(8,16)}somefile.txt字符串必須至少為 8 個(gè)字符,且不得超過(guò) 16 個(gè)字符
min(value){age:min(18)}19整數(shù)值必須至少為 18
max(value){age:max(120)}91整數(shù)值不得超過(guò) 120
range(min,max){age:range(18,120)}91整數(shù)值必須至少為 18,且不得超過(guò) 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 生成過(guò)程中存在非參數(shù)值

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

自定義路由約束


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

第一個(gè)參數(shù) httpContext 是當(dāng)前請(qǐ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請(qǐng)求的還是用 Url.Action 等方法生成Url。

舉一個(gè)實(shí)例,我們想要定義一個(gè)約束,指定路由傳過(guò)來(lái)的參數(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(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) ,否則對(duì)于 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è)路由。

ASP.NET 是什么

ASP.NET 是開源,跨平臺(tái),高性能,輕量級(jí)的 Web 應(yīng)用構(gòu)建框架,常用于通過(guò) HTML、CSS、JavaScript 以及服務(wù)器腳本來(lái)構(gòu)建網(wǎng)頁(yè)和網(wǎng)站。

以上就是怎么在ASP.NET Core中自定義路由約束,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)站名稱:怎么在ASP.NETCore中自定義路由約束-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)地址:http://weahome.cn/article/dsecos.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部