博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NETMVC Model验证(五)
阅读量:6574 次
发布时间:2019-06-24

本文共 4360 字,大约阅读时间需要 14 分钟。

ASP.NETMVC Model验证()

前言

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

Model验证

  • Model验证简单运用示例

  • ModelValidator使用生成过程

  • 自定义实现DefaultModelBinder进行验证

  • 自定义ModelValidatorProvider ModelValidator 

  • ValidationAttribute特性类使用

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

 

ValidationAttribute特性类使用

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

代码1-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

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

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

3

4

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

代码1-5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    
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一样。同样的都能实现功能,这里只是让大家对默认的绑定器营造个遐想的空间。

     本文转自jinyuan0829 51CTO博客,原文链接:http://blog.51cto.com/jinyuan/1438617
,如需转载请自行联系原作者
你可能感兴趣的文章
lnmp安装
查看>>
FTP工作方式
查看>>
Ubuntu16.04 ssh安及root登录
查看>>
C语言dos程序源代码分享(进制转换器)
查看>>
php项目中常用的log日志记录方法
查看>>
LogParser 导入MSSQL
查看>>
linux安装go环境并编写第一个go程序
查看>>
【在线研讨-现场文字】《敏捷开发用户故事分类与组织结构(二期-3)》2012-07-03...
查看>>
易语言 --什么情况下 用许可证
查看>>
项目总结:凡事预则立,不预则废!
查看>>
建属于自己的网站
查看>>
[linux] ubuntu 切换默认的/bin/sh
查看>>
boost库之智能指针
查看>>
linux c/c++ GDB教程详解(转载)
查看>>
我的友情链接
查看>>
自定义View Client 登录方式(一)
查看>>
cenOS+nginx+php+mysql (非一键包安装)
查看>>
我的友情链接
查看>>
我来自CSDN
查看>>
在mysql表中插入大量测试数据
查看>>