在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; }
原文地址:https://www.cnblogs.com/-zzc/p/14359876.html