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

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

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

      C# Web開發(fā)教程(十二)數(shù)據(jù)校驗機制

      內置數(shù)據(jù)校驗機制

      • 框架內置了對數(shù)據(jù)校驗的支持
      - 在System.ComponentModel.DataAnnotations這個命名空間下:
      	- 比如[Required]、[EmailAddress] 、[RegularExpression] 、 CustomValidationAttribute、IValidatableObject等待
      
      
      • demo演示
      // LoginRequest1.cs
      
      using System.ComponentModel.DataAnnotations;
      
      namespace WebApplicationAboutDataValidate
      {
          public class LoginRequest1
          {
              [Required]
              [EmailAddress]
              [RegularExpression("^.*@(qq|163)\\.com$", ErrorMessage = "只支持QQ和163郵箱")]
              public string Email { get; set; }
      
              [Required]
              [StringLength(10, MinimumLength = 3)]
              public string Password { get; set; }
              [Compare(nameof(Password2), ErrorMessage = "兩次密碼必須一致")]
              public string Password2 { get; set; }
          }
      }
      
      
      • 測試效果
      - 提交如下字段
      
      {
        "email": "user@example.com",
        "password": "string",
        "password2": "string"
      }
      
      - 返回:
      
      {
        "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
        "title": "One or more validation errors occurred.",
        "status": 400,
        "traceId": "00-840f868ea1c247a51f659d0092a68ae9-a7f61df6b9a99cd3-00",
        "errors": {
          "Email": [
            "只支持QQ和163郵箱"
          ]
        }
      }
      
      - 提交如下字段:
      
      {
        "email": "user@qq.com",
        "password": "string123",
        "password2": "string"
      }
      
      - 返回:
      
      {
        "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
        "title": "One or more validation errors occurred.",
        "status": 400,
        "traceId": "00-e635ad8de5684008becbe67b9be814e8-fea276f49eca5228-00",
        "errors": {
          "Password2": [
            "兩次密碼必須一致"
          ]
        }
      }
      
      • 內置數(shù)據(jù)校驗機制的問題點
      - 校驗規(guī)則都是和模型類耦合在一起,違反“單一職責原則”;
      - 很多常用的校驗都需要編寫自定義校驗規(guī)則,而且寫起來麻煩。
      

      數(shù)據(jù)校驗機制第三方庫--- FluentValidation1

      • FluentValidation在很多項目中都可以使用(比如WinForm,WPF)

      • 注意事項: FluentValidation可以和內置的數(shù)據(jù)校驗機制混用,但最好不要這么干,避免混淆和未知的坑.

      • 安裝庫

      - Install-Package Microsoft.EntityFrameworkCore.Tools -Version 6.0.0
      -  Install-Package FluentValidation.AspNetCore -Version 10.3.4 // 這里不要搞成6的版本,有坑
      
      • Program.cs注冊一下
      // LoginRequest1.cs
      using System.ComponentModel.DataAnnotations;
      
      namespace WebApplicationAboutDataValidate
      {
          public class LoginRequest1
          {
             
              public string Email { get; set; }
              public string UserName { get; set; }
              public string Password { get; set; }
              public string Password2 { get; set; }
          }
      }
      
      
      // AddNewUserRequestValidator.cs---自定義校驗器
      
      using FluentValidation;
      
      namespace WebApplicationAboutDataValidate
      {
          public class AddNewUserRequestValidator : AbstractValidator<LoginRequest1>
          {
              public AddNewUserRequestValidator()
              {
                  RuleFor(x => x.Email).NotNull().EmailAddress().WithMessage("郵箱必須是合法地址").Must(x => x.EndsWith("@163.com") || x.EndsWith("@qq.com")).WithMessage("支持163或者QQ郵箱");
                  RuleFor(x => x.UserName).NotNull().Length(3,10);
                  RuleFor(x => x.Password).Equal(x => x.Password2).WithMessage("兩次密碼必須一致");
              }
          }
      }
      
      // Program.cs
      ......
      builder.Services.AddSwaggerGen();
      // 注冊全局驗證器
      builder.Services.AddFluentValidation(fv => {
          Assembly assembly = Assembly.GetExecutingAssembly();
          fv.RegisterValidatorsFromAssembly(assembly);
      });
      var app = builder.Build();
      ......
      
      
      // 測試接口
      
      using Microsoft.AspNetCore.Mvc;
      
      namespace WebApplicationAboutDataValidate.Controllers
      {
          [ApiController]
          [Route("[controller]/[action]")]
          public class ValidateDataController : ControllerBase
          {
      
              [HttpPost]
              public ActionResult Login(LoginRequest1 req)
              {
                  return Ok(req);
              }
          }
      }
      
      
      
      
      - 測試: https://localhost:7263/ValidateData/Login
      
      {
        "email": "string",
        "userName": "string",
        "password": "string",
        "password2": "string111"
      }
      
      - 返回結果
      
      {
        "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
        "title": "One or more validation errors occurred.",
        "status": 400,
        "traceId": "00-7666f45f49e7afcab428d6bbd34d5bfb-1d6ed200ab8f73e3-00",
        "errors": {
          "Email": [
            "郵箱必須是合法地址",
            "支持163或者QQ郵箱"
          ],
          "Password": [
            "兩次密碼必須一致"
          ]
        }
      }
      
      • FluentValidation + DI高級功能---依賴注入: 可以通過構造方法來向校驗器注入服務
      using FluentValidation;
      using Microsoft.AspNetCore.Identity;
      
      namespace WebApplicationAboutDataValidate
      {
          public class AddNewUserRequestValidator : AbstractValidator<LoginRequest1>
          {
              public AddNewUserRequestValidator(UserManager<LoginRequest1> userManager)
              {
                  RuleFor(x => x.Email).NotNull().EmailAddress().WithMessage("郵箱必須是合法地址").Must(x => x.EndsWith("@163.com") || x.EndsWith("@qq.com")).WithMessage("支持163或者QQ郵箱");
                  RuleFor(x => x.UserName).NotNull().Length(3,10).MustAsync(async (x,_) => await userManager.FindByNameAsync(x) == null).WithMessage("用戶名已存在");
                  //RuleFor(x => x.Password).Equal(x => x.Password2).WithMessage("兩次密碼必須一致");
                  RuleFor(x => x.Password).Equal(x => x.Password2).WithMessage(x => $"密碼{x.Password}和{x.Password2}不一致");
              }
          }
      }
      
      

      核心要點總結

      1. 分離關注點:FluentValidation 將校驗邏輯從模型類中分離出來
      2. 鏈式編程:使用流暢的接口設計,代碼可讀性更強
      3. 靈活性強:支持復雜的業(yè)務邏輯校驗,包括異步校驗
      4. 錯誤信息定制:可以靈活定制錯誤消息,支持動態(tài)消息
      5. 依賴注入支持:可以在校驗器中注入服務,實現(xiàn)更復雜的業(yè)務校驗
      posted @ 2025-11-04 14:39  清安寧  閱讀(4)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 最新精品国偷自产在线美女足| 99精品伊人久久久大香线蕉| 老湿机69福利区无码| 最新中文字幕av无码专区不| 国产盗摄视频一区二区三区| 91中文字幕一区在线| 中文午夜乱理片无码| 亚洲岛国成人免费av| 亚洲精品一区二区妖精| 铜陵市| 日韩本精品一区二区三区| 国产精品自在线拍国产手机版| 久久精品国产久精国产| 精品人妻午夜一区二区三区四区| 玩弄放荡人妻少妇系列| 色综合久久蜜芽国产精品| 高清中文字幕国产精品| 亚洲日韩久热中文字幕| 99国产精品久久久久久久日本竹| 亚洲中文字幕av不卡无码| 国产成人精品中文字幕| 秋霞鲁丝片av无码少妇| 青青草国产精品一区二区| 国产欧美日韩亚洲一区二区三区| 乐昌市| 干老熟女干老穴干老女人| 综合图区亚洲欧美另类图片| 中文字幕国产精品日韩| 亚洲全乱码精品一区二区| 亚洲黄色性视频| 黑人精品一区二区三区不| 国产成人啪精品午夜网站| 亚洲乱妇熟女爽到高潮的片| 国产乱对白刺激视频| 国产精品高清一区二区不卡| 国产精品二区中文字幕| 麻豆成人久久精品二区三| 国产精品美女黑丝流水| 娇妻玩4p被三个男人伺候| 亚洲伊人精品久视频国产| 久久久久无码中|