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;}  
}

 

posted @ 2020-02-06 15:11  水墨晨诗  阅读(218)  评论(0编辑  收藏  举报