• 在ASP.NET Core中使用Model验证


    官方地址:

    https://docs.microsoft.com/zh-cn/aspnet/core/mvc/models/validation?view=aspnetcore-5.0

    内置特性

    https://docs.microsoft.com/zh-cn/aspnet/core/mvc/models/validation?view=aspnetcore-5.0#built-in-attributes

    客户端验证

     添加User类

    using System.ComponentModel.DataAnnotations;
    
        public class User
        {
            [Display(Name = "名称"), Required(ErrorMessage = "{0}不能为空"), MaxLength(10, ErrorMessage = "长度不超过10个")]
            public string UserName { get; set; }
    
            [Display(Name = "年龄")]
            [Required(ErrorMessage = "{0}不能为空")]
            public int? UserAge { get; set; }
    
            [Display(Name = "身份证")]
            [Required(ErrorMessage = "{0}不能为空")]
            [StringLength(18, MinimumLength = 18, ErrorMessage = "{0}长度是{1}")]
            public string IDCard { get; set; }
    
            [Display(Name = "邮箱地址")]
            [Required(ErrorMessage = "{0}不能为空")]
            [EmailAddress( ErrorMessage = "邮箱格式不正确")]
            public string Email { get; set; }
    
            [Display(Name = "出生日期")]
            [Required(ErrorMessage = "{0}不能为空")]
            [DataType(DataType.Date)]
            public DateTime? BirtheTime { get; set; }
        }

    添加前端界面

    <form  method="post" asp-controller="Home" asp-action="Privacy">
        <div class="form-group row">
            <label asp-for="UserName" class="col-sm-1"></label>
            <div class="col-lg-10">
                <input class="form-control" asp-for="UserName" />
                <span style="color:red" asp-validation-for="UserName"></span>
            </div>
        </div>
        <div class="form-group row">
            <label asp-for="UserAge" class="col-sm-1"></label>
            <div class="col-lg-10">
                <input class="form-control" asp-for="UserAge" />
                <span style="color:red" asp-validation-for="UserAge"></span>
            </div>
        </div>
        <div class="form-group row">
            <label asp-for="IDCard" class="col-sm-1"></label>
            <div class="col-lg-10">
                <input class="form-control" asp-for="IDCard" />
                <span style="color:red" asp-validation-for="IDCard"></span>
            </div>
        </div>
        <div class="form-group row">
            <label asp-for="Email" class="col-sm-1"></label>
            <div class="col-lg-10">
                <input class="form-control" asp-for="Email" />
                <span style="color:red" asp-validation-for="Email"></span>
            </div>
        </div>
        <div class="form-group row">
            <label asp-for="BirtheTime" class="col-sm-1"></label>
            <div class="col-lg-10">
                <input class="form-control" asp-for="BirtheTime" />
                <span style="color:red" asp-validation-for="BirtheTime"></span>
            </div>
        </div>
        <!--model级别-->
        <div style="color:red" asp-validation-summary="ModelOnly"></div>
        <!--错误总汇-->
        <div style="color:red" asp-validation-summary="All"></div>
    
    </form>
    
    <!--使用验证CDN -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.1/jquery.validate.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.js"></script>

    控制器中验证

    使用ModelState.IsValid或者TryValidateModel(User, nameof(User)判断模型是否通过

      public IActionResult Privacy(User user)
      {
         if (ModelState.IsValid)
         {
    
         }
         else
         {
                    ModelState.AddModelError(string.Empty, "输入有误");
         }
         return View(user);
       }

     效果

    远程特性

    在User类的UserName属性上添加

    [Remote(action: "VerifyName", controller: "Home")]

    添加Action

    [AcceptVerbs("GET", "POST")]
    public IActionResult VerifyName(User user)
    {
      if (user.UserName == "Admin")
      {
       return Json($"用户名{user.UserName}已存在");
     }
       return Json(true);
    }

    效果

     自定义验证

     属性级别

    public class User: IValidatableObject
    {
            [Display(Name = "名称"), Required(ErrorMessage = "{0}不能为空"), MaxLength(10, ErrorMessage = "长度不超过10个")]
            public string UserName { get; set; }
    
            [Display(Name = "工号")]
            [Required(ErrorMessage = "{0}不能为空")]
            [StringLength(10, MinimumLength = 1, ErrorMessage = "{0}长度是{1}")]
            public string EmployeeNo { get; set; }
    
            /// <summary>
            /// 属性级别的自定义验证
            /// </summary>
            /// <param name="validationContext"></param>
            /// <returns></returns>
            public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
            {
                if (UserName == EmployeeNo )
                {
                    yield return new ValidationResult("名称和工号不能一样", new[] { nameof(UserName ), nameof(EmployeeNo ) });
                }
            }
    }

    效果 

    类级别

    public class ValidatorUrlAttribute : Attribute, IModelValidator
    {
      public string ErrorMessage { get; set; }
    
     public IEnumerable<ModelValidationResult> Validate(ModelValidationContext context)
     {
      var url = context.Model as string;
      if (url != null && Uri.IsWellFormedUriString(url, UriKind.Absolute))
      {
       return Enumerable.Empty<ModelValidationResult>();
      }
      return new List<ModelValidationResult>()
      {
       new  ModelValidationResult(string.Empty,ErrorMessage)
      };
    }
    }

    调用

    [ValidatorUrl(ErrorMessage = "这个Url不正确")]//自定义验证
     public string Url { get; set; }
  • 相关阅读:
    一个或多个listeners启动失败,更多详细信息查看对应的容器日志文件
    java: Compilation failed: internal java compiler error
    新建IEDA项目,运行跳出页面404
    windows版 nvm 1.1.7 安装(填坑)
    向量法求三角形垂点
    error C4430:missing type specifier 解决错误
    QML 从无到有 3 (自动更新)
    QML 从无到有 2 (移动适配)
    QML 从无到有 (基础)
    c++ builder 2010 错误 F1004 Internal compiler error at 0x9740d99 with base 0x9
  • 原文地址:https://www.cnblogs.com/-zzc/p/14359876.html
Copyright © 2020-2023  润新知