青岛澄润国际贸易有限公司

现在的位置: 主页 > 商讯 > 文章列表

文章正文

ASP.NET MVC Model验证(四)

作者:青岛澄润国际贸易有限公司 来源:wwww.usabcc.com 发布时间:2017-09-05 12:00:03
ASP.NET MVC Model验证(四) 前言

本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而ModelValidator类型则是Model验证执行类型,专题系统,在下面的示例中会使用Model验证提供程序结合Model验证执行类型来执行Model验证,就是使用上个篇幅中所讲的实现个Model绑定器继承自DefaultModelBinder类型,在自定义Model绑定器中使用ModelValidator类型。

Model验证

Model验证简单运用示例

ModelValidator使用生成过程

自定义实现DefaultModelBinder进行验证

自定义ModelValidatorProvider 和ModelValidator

ValidationAttribute特性类使用

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

自定义ModelValidatorProvider 和ModelValidator

ModelValidator

深呼吸一下,直接进入主题。

在我们定义自定义的ModelValidator类型之前,先看一下ModelValidator类型的定义,代码1-1.

代码1-1

复制代码

public abstract class ModelValidator

{

protected ModelValidator(ModelMetadata metadata, ControllerContext controllerContext);

protected internal ControllerContext ControllerContext { get; }

public virtual bool IsRequired { get; }

//

// 摘要:

// 获取模型验证程序的元数据。

//

// 返回结果:

// 模型验证程序的元数据。

protected internal ModelMetadata Metadata { get; }

public virtual IEnumerable<ModelClientValidationRule> GetClientValidationRules();

public static ModelValidator GetModelValidator(ModelMetadata metadata, ControllerContext context);

//

// 摘要:

// 在派生类中实现时验证对象。

//

// 参数:

// container:

// 容器。

//

// 返回结果:

// 验证结果的列表。

public abstract IEnumerable<ModelValidationResult> Validate(object container);

}

复制代码

代码1-1中,我们可以看到ModelValidator类型的构造是可以重写的,这样便于我们自定义一些所需的数据,不过下面的示例中并没有这么做,目的是在于简单的演示,然后我们再看一下Metadata属性,这个属性非常重要了,它表示封装着所要进行验证的Model或者是Model属性的信息在此提醒大家关注一下,最后要看的就是Validate()抽象方法了,我们自定义类型必须实现的这么一个方法,在它的返回类型中有个ModelValidationResult类型,我们就来看一下ModelValidationResult类型,代码1-2.

代码1-2

复制代码

public class ModelValidationResult

{

public ModelValidationResult();

// 摘要:

// 获取或设置成员名。

//

// 返回结果:

// 成员名。

public string MemberName { get; set; }

//

// 摘要:

// 获取或设置验证结果消息。

//

// 返回结果:

// 验证结果消息。

public string Message { get; set; }

}

复制代码

正如大家所看到的,代码1-2没啥好说的,看完本篇自然明白。

ASP.NET MVC Model验证(三)和ASP.NET MVC Model验证(一)中的示例想必有的朋友是看过了,没看过的朋友建议去快速的看一下篇幅一和篇幅三的示例部分(本篇示例的基础依赖上篇的基础部分,篇幅长度原因这里就不再次说明了),在这里我想说的是Model验证也是分级别的,就是上篇中也有提到过的Model级验证和Model属性级验证,在下面的示例中,我把上篇篇幅中的验证过程拆成三个部分(可以写在一起,便于理解)。

我把第一个部分定义为Model属性级验证,我们来看一下示例代码1-3。

代码1-3

复制代码

public class MyCustomModelPropertyValidator : ModelValidator

{

public MyCustomModelPropertyValidator(ModelMetadata modelMetadata, ControllerContext controllContext)

: base(modelMetadata, controllContext)

{ }

public override IEnumerable<ModelValidationResult> Validate(object container)

{

switch (Metadata.PropertyName)

{

case "ID":

if (string.IsNullOrEmpty((string)container) || (string)container == "")

{

return new ModelValidationResult[]

{

new ModelValidationResult()

{

MemberName="ID",

Message= "请输入ID,ID不能为空!"

}

};

}

break;

case "UserID":

if (string.IsNullOrEmpty((string)container) || (string)container == "")

{

return new ModelValidationResult[]

{

new ModelValidationResult()

{

MemberName="UserID",

Message= "请输入用户账户,用户账户不能为空!"

}

};

}

break;

case "Password1":

if (string.IsNullOrEmpty((string)container) || (string)container == "")

{

ControllerContext.Controller.TempData.Add("Password1", false);

return new ModelValidationResult[]

{

new ModelValidationResult()

{

MemberName="Password1",

Message= "请输入登录密码,登录密码不能为空!"

}

};

}

break;

case "Password2":

if (string.IsNullOrEmpty((string)container) || (string)container == "")

{

ControllerContext.Controller.TempData.Add("Password2", false);

return new ModelValidationResult[]

{

new ModelValidationResult()

{

MemberName="Pssword2",

Message= "请再次输入密码,密码不能为空!"

}

};

}

break;

case "Name":

return Enumerable.Empty<ModelValidationResult>();

}

return Enumerable.Empty<ModelValidationResult>();

}

}

复制代码

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:宜昌网站制作 http://yichang.666rj.com

COPYRIGHT © 2015 青岛澄润国际贸易有限公司 ALL RIGHTS RESERVED.

网站地图 技术支持:肥猫科技
精彩专题:网站建设
购买本站友情链接、项目合作请联系客服QQ:2500-38-100