91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在ASP.NET Core中自定義路由約束

發布時間:2021-05-24 17:58:30 來源:億速云 閱讀:173 作者:Leah 欄目:開發技術

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

路由約束

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

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

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

框架內部已經提供了一些約束,如下所示:

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

內置的約束能夠適用于大部分常見的應用場景,但是有時候我們還是需要去自定義我們想要的效果。

自定義路由約束

自定義約束是要實現 IRouteConstraint 接口,然后重載 Match 方法,該方法有四個參數。

第一個參數 httpContext 是當前請求的上下文

第二個參數 route 是當前約束所屬的路由

第三個參數 routeKey 是當前檢查的變量名,例如文章開頭示例中的 id

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

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

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

我們先定義一個枚舉:

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 是當前的 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 會有沖突。

運行程序,當路由是 api/Test/0 、 api/Test/1 、 api/Test/True 和 api/Test/False 的時候,匹配我們的自定義約束。

當路由是 api/Test/{大于2的整數} 的時候,匹配第二個路由。

其他情況匹配第三個路由。

ASP.NET 是什么

ASP.NET 是開源,跨平臺,高性能,輕量級的 Web 應用構建框架,常用于通過 HTML、CSS、JavaScript 以及服務器腳本來構建網頁和網站。

以上就是怎么在ASP.NET Core中自定義路由約束,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

伊吾县| 新河县| 德格县| 桦甸市| 罗江县| 共和县| 北流市| 宜州市| 鸡东县| 扶余县| 桦甸市| 台江县| 开鲁县| 中宁县| 芮城县| 长岛县| 和硕县| 嘉义县| 崇礼县| 宁远县| 古丈县| 北碚区| 施甸县| 通海县| 五指山市| 丰原市| 昌平区| 汉沽区| 玉屏| 德格县| 洪江市| 徐州市| 奎屯市| 大理市| 乐清市| 黑山县| 卢龙县| 项城市| 门头沟区| 达孜县| 珲春市|