欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET MVC Model验证(五)

程序员文章站 2022-07-01 15:10:51
前言 上篇主要讲解modelvalidatorprovider 和modelvalidator两种类型的自定义实现, 然而在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 mapplication.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属性的值相同,不然就会提示验证的错误信息

 

 

 

 

 

 

自定义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一样。同样的都能实现功能,这里只是让大家对默认的绑定器营造个遐想的空间。