• ASP.NET MVC Model验证(五)


    ASP.NET MVC Model验证()

    前言

    上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它方式来进行Model验证,也就是本篇的主题,使用框架提供给我们的一系列的特性类型来进行Model验证,当然也是可以自定义的,在下面的演示示例中,我会使用我们自己自定义的特性类型(继承自ValidationAttribute类型)到自定义Model绑定器中来模拟一下实现。

     

    Model验证

    • Model验证简单运用示例
    • ModelValidator使用生成过程
    • 自定义实现DefaultModelBinder进行验证
    • 自定义ModelValidatorProvider 和ModelValidator 
    • ValidationAttribute特性类使用
    • 自定义ValidationAttribute特性类的示例实现

    ValidationAttribute特性类使用

    我们首先看一下ValidationAttribute类型的定义,示例代码1-1。

    代码1-1

        public abstract class ValidationAttribute : Attribute
        {
            protected ValidationAttribute();
            protected ValidationAttribute(Func<string> errorMessageAccessor);
            protected ValidationAttribute(string errorMessage);
    
            // 摘要:
            //     获取或设置一条在验证失败的情况下与验证控件关联的错误消息。
            //
            // 返回结果:
            //     与验证控件关联的错误消息。
            public string ErrorMessage { get; set; }
            public string ErrorMessageResourceName { get; set; }
            public Type ErrorMessageResourceType { get; set; }
            protected string ErrorMessageString { get; }
            public virtual string FormatErrorMessage(string name);
            public ValidationResult GetValidationResult(object value, ValidationContext validationContext);
            //
            // 摘要:
            //     确定对象的指定值是否有效。
            //
            // 参数:
            //   value:
            //     要验证的对象的值。
            //
            // 返回结果:
            //     如果指定的值有效,则为 true;否则,为 false。
            public virtual bool IsValid(object value);
            protected virtual ValidationResult IsValid(object value, ValidationContext validationContext);
            public void Validate(object value, string name);
            public void Validate(object value, ValidationContext validationContext);
        }

    ValidationAttribute类型就是下面示例中所有应用在Model属性上特性类型的基类,在上面的ValidationAttribute类型中ErrorMessage属性表示验证错误所显示信息,IsValid()方法则是表示验证的值是否通过,下面我们看一下框架给我们提供的Model验证特性类的简单示例。

    首先我们还是使用ASP.NET MVC Model验证(一)中的示例代码,看一下ViewModel使用了验证特性类后的定义,示例代码1-2.

    代码1-2

    namespace MvcApplication.Models
    {
        /// <summary>
        /// ViewModel-用户注册信息
        /// </summary>
        public class RegistrationInformation
        {
            [Required]
            public string ID { get; set; }
            [Required]
            public string UserID { get; set; }
            [Required]
            [StringLength(10)]
            public string Password1 { get; set; }
            [Compare("Password1")]
            public string Password2 { get; set; }
            
            public string Name { get; set; }
        }
    }

    在代码1-2中,我们看到了一些应用于Model属性上的特性类,下面简单的说一下这几种类型的含义。

    Required:[Required],表示此属性不得为空(包括空字符串),当然了也可以通过设置内部的AllowEmptyStrings属性为true后,则视为可以为空。

    StringLength:[StringLength(10)],表示此属性值的字符串最大长度不能超过10。

    Compare:[Compare(“Password1”)],表示此属性的值必须和指定属性的值相同,示例中就是Password2的值必须和Password1属性的值相同,不然就会提示验证的错误信息

    下面来一下项目运行后的结果图,

    图1

    图1中故意输入的这些数值,看下图2是验证后的结果

    图2

     

     

    自定义ValidationAttribute特性类的示例实现

    这一小节我们直接来看自定义Model验证特性类型,直接来看定义的示例代码1-3.

    代码1-3

    namespace MvcApplication.ModelValidators
    {
        [AttributeUsage(AttributeTargets.Property,AllowMultiple=true,Inherited=false)]
        public class CustomModelValidatorAttribute:ValidationAttribute
        {
    
            public override bool IsValid(object value)
            {
                if (string.IsNullOrEmpty((string)value) || string.Compare((string)value, "jinyuan", true) == 0)
                {
                    ErrorMessage = "不能为空,或名称不合法!";
                    return false;
                }
                else
                {
                    return true;
                }
            }
        }
    }

    这里为什么要重写基类的IsValid()方法,可能MVC框架会调用这个方法来判断当前值是否通过验证,这里说一句题外话,在MVC框架中我翻看过默认绑定器类型的实现代码,并没有找到对Model验证特性类的调用,哪位大神知道的话告知一下小弟感激不尽。

    现在我们再修改一下代码1-2中的定义,示例代码1-4.

    代码1-4

    [CustomModelValidator]
    public string Name { get; set; }

    修改过后我们看一下结果图3和图4.

    图3

    图4

    看到这里,有点不死心,想模拟实现一下默认绑定器的内部实现,这部分内容仅供参考,示例代码1-5.

    代码1-5

    public class CustomModelValidatorAttributeModelBinder : DefaultModelBinder
        {
            protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
            {
                base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
                foreach (Attribute att in propertyDescriptor.Attributes)
                {
                    if (att is ModelValidators.CustomModelValidatorAttribute)
                    {
                        ModelValidators.CustomModelValidatorAttribute mva = att as ModelValidators.CustomModelValidatorAttribute;
                        if (!mva.IsValid(value))
                        {
                            bindingContext.ModelState.AddModelError(propertyDescriptor.Name, mva.ErrorMessage);
                        }
                    }
                }
            }
        }

    在代码1-5中我们根据PropertyDescriptor类型的参数获取到应用在Model属性上的所有特性类,然后筛选到我们自定义的类型,进行一个验证判断然后将其错误信息添加到ModelState中,需要把我们自定义的这个Model绑定器注册到系统中,运行的时候按照图3的输入,结果就跟图4一样。同样的都能实现功能,这里只是让大家对默认的绑定器营造个遐想的空间。

    吐槽下,博客园最近肿么了?会有点小问题阿。刚发了邮件没多会问题又给解决掉了,真心给力!!!

     

    作者:金源

    出处:http://www.cnblogs.com/jin-yuan/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

  • 相关阅读:
    【Android 开源项目】下拉刷新Android-PullToRefresh介绍
    【Android 分享】ShareSDK微信分享详解
    android面试经验谈
    Android面试过程描述
    浅谈Android客户端项目框架
    面试时如何谈自己做过的项目
    直接拿来用!最火的Android开源项目(一)
    Android开发项目经验
    dom解析xml
    Android学习之简单的拍照功能
  • 原文地址:https://www.cnblogs.com/jin-yuan/p/3847352.html
Copyright © 2020-2023  润新知