ASP.NET MVC中对action中的model进行认证。
方法一:使用特性标签。微软提供的这种方式只能作用于属性上。
public class Person { [Required] [StringLength(18)] [Display(Name = "身份证号")] public string ID { get; set; } [Required] [Range(0, 150)] public int Age { get; set; } [Required] public string Name { get; set; } [Required] public string Sex { get; set; } }
方法二:继承 IValidatableObject 接口,并实现接口中的Validate方法,这种方式也只能作用于属性上。
public class Person : IValidatableObject { public string ID { get; set; } public int Age { get; set; } public string Name { get; set; } public string Sex { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { List<ValidationResult> results = new List<ValidationResult>(); if (ID.Length != 18) { results.Add(new ValidationResult("身份证号码有误。")); } if (Age < 0 || Age > 150) { results.Add(new ValidationResult("妖寿啊。")); } return results; } }
方法三:自己写一个特性,然后给model上打上这个标签。
public class Person { public string ID { get; set; } public int Age { get; set; } public string Name { get; set; } public string Sex { get; set; } } public class CheckPersonIsValidAttribute : ValidationAttribute { /// <summary> /// /// </summary> /// <param name="value">如果将特性打在了类名上,该参数是类的一些信息;如果打在了属性上,那么就是属性的信息。</param> /// <param name="validationContext"></param> /// <returns></returns> protected override ValidationResult IsValid(object value, ValidationContext validationContext) { var dto = (Person)validationContext.ObjectInstance; if (dto.ID.Length != 18) { return new ValidationResult("身份证号有误。"); } if (string.IsNullOrWhiteSpace(dto.Name)) { return new ValidationResult("姓名不能为空"); } return ValidationResult.Success; } }
当ModelState.IsValid 为false的时候,后去错误信息。
public static string GetInVliadMsg(System.Web.Mvc.ModelStateDictionary modelState) { StringBuilder sb = new StringBuilder(); foreach (var key in modelState.Keys) { if (modelState[key].Errors.Count <= 0) continue; sb.AppendFormat("属性【{0}】错误", key); foreach (var modelError in modelState[key].Errors) { sb.AppendLine(modelError.ErrorMessage); } } return sb.ToString(); }
通常我们会在接收请求时,对请求的参数(通常是 DTO)进行验证 ,当用户提交的参数不符合我们的验证时,就会报错,下面就是当请求的参数没有验证通过。后台返回的具体信息。
其中,右上角是状态码,左下角是 没有通过的属性:Title,错误信息是:title 不可为空
Public Class TouristRouteForCreationDto{ [Required(ErrorMessage="title 不可为空")] [MaxLenth(100)] public string Title{get;set;} }