官方地址:
https://docs.microsoft.com/zh-cn/aspnet/core/mvc/models/validation?view=aspnetcore-5.0
内置特性
客户端验证
添加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; }