温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

ASP.NETMVC Model验证(五)

发布时间:2020-08-08 09:18:25 来源:网络 阅读:1236 作者:jinyuan0829 栏目:编程语言

ASP.NETMVC Model验证()

前言

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

Model验证

  • Model验证简单运用示例

  • ModelValidator使用生成过程

  • 自定义实现DefaultModelBinder进行验证

  • 自定义ModelValidatorProvider ModelValidator 

  • ValidationAttribute特性类使用

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

 

ValidationAttribute特性类使用

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

代码1-1

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


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

首先我们还是使用ASP.NETMVC 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

ASP.NETMVC Model验证(五)


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

2

ASP.NETMVC Model验证(五)



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

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

代码1-3

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


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

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

代码1-4

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

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

3

ASP.NETMVC Model验证(五)

4

ASP.NETMVC Model验证(五)


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

代码1-5

    public class CustomModelValidatorAttributeModelBinder: DefaultModelBinder
    {
        protectedoverride voidSetProperty(ControllerContextcontrollerContext, ModelBindingContextbindingContext, PropertyDescriptorpropertyDescriptor, object value)
        {
            base.SetProperty(controllerContext,bindingContext, propertyDescriptor, value);
            foreach(Attribute att inpropertyDescriptor.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一样。同样的都能实现功能,这里只是让大家对默认的绑定器营造个遐想的空间。


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI