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()]
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) == )
{
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/

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

ASP.NET MVC Model验证(五)的更多相关文章

  1. ASP.NET MVC Model验证(四)

    ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...

  2. ASP.NET MVC Model验证(三)

    ASP.NET MVC Model验证(三) 前言 上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的M ...

  3. ASP.NET MVC Model验证(二)

    ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下 ...

  4. ASP.NET MVC Model验证(一)

    ASP.NET MVC Model验证(一) 前言 前面对于Model绑定部分作了大概的介绍,从这章开始就进入Model验证部分了,这个实际上是一个系列的Model的绑定往往都是伴随着验证的.也会在后 ...

  5. ASP.NET MVC Model绑定(五)

    ASP.NET MVC Model绑定(五) 前言 前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了讲解,本篇将会对IValueProvider的使用做个基础的示例讲解,读完本 ...

  6. ASP.NET MVC Model元数据(五)

    ASP.NET MVC Model元数据(五) 前言 在上一篇中我们描述了应用于Model上面的各种用于显示控制的特性类,在本篇中将详细的介绍这些特性类的应用,虽然它们跟Model元数据的直接关系并不 ...

  7. 详解ASP.NET MVC Model验证

    ASP.NET mvc的最好的优点之一就是支持Model验证,这个特性很方便你可以选择在定义Model的时候在字段中采用特性进行注解约定,也可以在代码中自己进行手动验证.下面就来细说一下ASP.NET ...

  8. 【转】【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式

    本文属转载,来源: http://www.byywee.com/page/M0/S868/868615.html 关于Model验证官方资料: http://msdn.microsoft.com/zh ...

  9. 【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式

    转自:http://www.cnblogs.com/easy5weikai/p/3843131.html 关于Model验证官方资料: http://msdn.microsoft.com/zh-cn/ ...

随机推荐

  1. .NetCore MVC中的路由(2)在路由中使用约束

    p { margin-bottom: 0.25cm; direction: ltr; color: #000000; line-height: 120%; orphans: 2; widows: 2 ...

  2. web前端基础知识

    #HTML    什么是HTML,和他ML...    网页可以比作一个装修好了的,可以娶媳妇的房子.    房子分为:毛坯房,精装修    毛坯房的修建: 砖,瓦,水泥,石头,石子....    精 ...

  3. 3.Windows Server 2012 R2数据库部署

    很多人竟然不会安装数据库....好吧,来个图文教程,其实和windows里面一样安装,和安装2008一样的 先安装3.5:http://www.cnblogs.com/dunitian/p/53487 ...

  4. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  5. OpenSceneGraph in ActiveX by ActiveQt

    OpenSceneGraph in ActiveX by ActiveQt eryar@163.com Abstract. Qt’s ActiveX and COM support allows Qt ...

  6. EntityFramework Core 1.1是如何创建DbContext实例的呢?

    前言 上一篇我们简单讲述了在EF Core1.1中如何进行迁移,本文我们来讲讲EF Core1.1中那些不为人知的事,细抠细节,从我做起. 显式创建DbContext实例 通过带OnConfiguri ...

  7. NET Core-学习笔记(四)

    经过前面分享的三篇netcore心得再加上本篇分享的知识,netcore大部分常用知识应该差不多了,接下来将不会按照章节整合一起分享,因为涉及到的东西整合到一起篇幅太大了,所以后面分享将会按照某一个知 ...

  8. mac下安装及配置tomcat

    mac下的软件不像windows下的程序那样写注册表,对于tomcat的安装来说,在mac下是名符其实的绿色软件,具体操作如下: 1.到 apache官方主页 下载完整 tar.gz文件包.(没有专门 ...

  9. 当web.config文件放置在共享目录下(UNC),启动IIS会提示有错误信息500.19,伴随有错误代码0x80070003和错误代码0x80070005的解决办法

    最近遇到一个很有意思的使用环境,操作人员将所有的网站应用内容投放到共享存储里面,并且使用微软的SMB协议将其以CIFS的方式共享出来,使用Windows Server 2008 R2的IIS将其连接起 ...

  10. java统计字符串单词的个数

    在一些项目中可能需要对一段字符串中的单词进行统计,我在这里写了一个简单的demo,有需要的同学可以拿去看一下. 本人没怎么写个播客,如果有啥说的不对的地方,你来打我啊 不说废话了直接贴代码: 实现代码 ...