您的位置:首页 > 编程语言 > ASP

ASP.NET MVC Model验证(五)

2017-04-28 15:17 316 查看

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://blog.csdn.net/jinyuan0829

本文版权归作者和CSDN共同拥有,欢迎转载,但未经作者允许必须保留此段声明。且在文章页面
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: