一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 手把手教你AspNetCore WebApi數據驗證的實現

手把手教你AspNetCore WebApi數據驗證的實現

2021-12-03 16:15深度碼農 ASP.NET教程

這篇文章主要介紹了手把手教你AspNetCore WebApi數據驗證的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

小明最近又遇到麻煩了,小紅希望對接接口傳送的數據進行驗證,既然是小紅要求,那小明說什么都得滿足呀,這還不簡單嘛。

傳統驗證

?
1
2
3
4
5
6
7
8
9
10
11
12
[HttpPost]
public async Task<ActionResult<Todo>> PostTodo(Todo todo)
{
  if (string.IsNullOrEmpty(todo.Name))
  {
    return Ok("名稱不能為空");
  }
  context.Todo.Add(todo);
  await context.SaveChangesAsync();
 
  return CreatedAtAction("GetTodo", new { id = todo.Id }, todo);
}

小明寫著寫著發現這樣寫,很多接口相同得地方都要寫,使得代碼比較臃腫。

使用模型驗證

在參數模型上打上注解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace App001.Models
{
  /// <summary>
  /// 待辦事項
  /// </summary>
  public class Todo
  {
    /// <summary>
    /// ID
    /// </summary>
    public Guid Id { get; set; }
    /// <summary>
    /// 名稱
    /// </summary>
    [Required(ErrorMessage = "名稱不能為空")]
    public string Name { get; set; }
  }
}

Postman測試Name傳值未空時,則返回:

?
1
2
3
4
5
6
7
8
9
10
11
{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "|df184e36-4e11844dfd38a626.",
  "errors": {
    "Name": [
      "名稱不能為空"
    ]
  }
}

注意Web API 控制器具有 [ApiController] 特性,則它們不必檢查ModelState.IsValid。在此情況下,如果模型狀態無效,將返回包含錯誤詳細信息的自動 HTTP 400 響應。

內置特性

  • [CreditCard]:驗證屬性是否具有信用卡格式。
  • [Compare]:驗證模型中的兩個屬性是否匹配。
  • [EmailAddress]:驗證屬性是否具有電子郵件格式。
  • [Phone]:驗證屬性是否具有電話號碼格式。
  • [Range]:驗證屬性值是否在指定的范圍內。
  • [RegularExpression]:驗證屬性值是否與指定的正則表達式匹配。
  • [Required]:驗證字段是否不為 null。
  • [StringLength]:驗證字符串屬性值是否不超過指定長度限制。
  • [Url]:驗證屬性是否具有 URL 格式。
  • [Remote]:通過在服務器上調用操作方法來驗證客戶端上的輸入。

Error messages

通過驗證特性可以指定要為無效輸入顯示的錯誤消息。 例如:

?
1
[Required(ErrorMessage = "名稱不能為空")]

使用自定義返回消息格式

有兩種方式:

  • 使用自定義過濾器
  • 使用默認模型驗證,需要在控制器上面加上【ApiController】。

使用自定義過濾器

首先,創建ModelValidateActionFilterAttribute過濾器。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class ModelValidateActionFilterAttribute : ActionFilterAttribute
{
  public override void OnActionExecuting(ActionExecutingContext context)
  {
    if (!context.ModelState.IsValid)
    {
      //獲取驗證失敗的模型字段
      var errors = context.ModelState
        .Where(e => e.Value.Errors.Count > 0)
        .Select(e => e.Value.Errors.First().ErrorMessage)
        .ToList();
 
      var str = string.Join("|", errors);
 
      //設置返回內容
      var result = new
      {
        Code = 10000,
        Msg = "未通過數據驗證。",
        FullMsg = str
      };
 
      context.Result = new BadRequestObjectResult(result);
    }
 
  }
}

然后,Startup.ConfigureServices將過濾器添加到控制器中并關閉默認模型驗證,另外我們還添加了AddNewtonsoftJson。

?
1
2
3
4
5
6
7
8
9
10
11
//關閉默認模型驗證
services.Configure<ApiBehaviorOptions>(opt => opt.SuppressModelStateInvalidFilter = true);
services.AddControllers(opt =>
{
  //添加過濾器
  opt.Filters.Add(typeof(ModelValidateActionFilterAttribute));
}).AddNewtonsoftJson(opt =>
{
  //json字符串大小寫原樣輸出
  opt.SerializerSettings.ContractResolver = new DefaultContractResolver();
});

最后,我們看一下返回效果:

?
1
2
3
4
5
{
  "Code": 10000,
  "Msg": "未通過數據驗證。",
  "FullMsg": "名稱不能為空。"
}

使用默認模型驗證

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
services.Configure<ApiBehaviorOptions>(opt =>
{
  opt.InvalidModelStateResponseFactory = actionContext =>
  {
    //獲取驗證失敗的模型字段
    var errors = actionContext.ModelState
      .Where(e => e.Value.Errors.Count > 0)
      .Select(e => e.Value.Errors.First().ErrorMessage)
      .ToList();
 
    var str = string.Join("|", errors);
 
    //設置返回內容
    var result = new
    {
      Code = 10000,
      Msg = "未通過數據驗證。",
      FullMsg = str
    };
 
    return new BadRequestObjectResult(result);
  };
});

小結

目前為止,小明把數據驗證也搞定了,是不是so easy!

到此這篇關于手把手教你AspNetCore WebApi數據驗證的實現的文章就介紹到這了,更多相關AspNetCore WebApi數據驗證內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/zcqiand/p/13795675.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲 欧美 中文 日韩欧美 | 香蕉精品国产高清自在自线 | 亚洲午夜精品久久久久 | 欧美成人福利视频 | 日本护士撒尿xxxx欧美 | 日韩精品一区二区三区中文在线 | 免费看日韩 | 日本激情网站 | 2020年国产精品午夜福利在线观看 | 俄罗斯美女尿尿 | 好姑娘在线完整版视频 | 久久精品WWW人人爽人人 | 天天色天 | 欧美一级特黄aaa大片 | 久久亚洲精品中文字幕60分钟 | 91精品导航在线观看 | 俄罗斯图书馆无打码久久 | 千金在线观看 | 西野翔全部作品在线观看 | 男女男精品网站 | 亚洲高清视频网站 | 久久精品热只有精品 | 国产精品高清一区二区三区不卡 | 视频一本大道香蕉久在线播放 | 亚洲不卡高清免v无码屋 | 夫妻性生活免费在线观看 | 亚洲码和乱人伦中文一区 | 国产精品资源在线观看网站 | 免费国产高清视频 | 给我免费观看的视频在线播放 | 成人精品第一区二区三区 | 亚洲天堂视频在线观看免费 | 亚洲高清一区二区三区四区 | 国产精品99久久久 | 色老女人| 欧美视频在线播放观看免费福利资源 | 亚洲 欧美 制服 校园 动漫 | 无套插入 | 四虎影音先锋 | 色综合色狠狠天天综合色 | 很黄的网站在线观看 |