mvc基础系列说谈(6)——数据验证(上)

简介: (一)基本验证 通过htmlhelper来验证。 以Customer为例: 在创建(Create)视图中,如果应用了验证:             Fields          FirstName:                          LastName:        ...

(一)基本验证

通过htmlhelper来验证。

Customer为例:

在创建(Create)视图中,如果应用了验证:

<% =  Html.ValidationSummary( " Create was unsuccessful. 
Please correct the errors  and  try again. " ) %>
     < % using (Html.BeginForm( " Create " " Customer "
       FormMethod.Post, 
new  {enctype  =   " application/x-www-form-urlencoded "  }))
   {
%>
    
< fieldset >
    
< legend > Fields </ legend >
    
< p >
      
< label  for ="FirstName" > FirstName: </ label >
      
<% =  Html.TextBox( " FirstName " %>
      
<% =  Html.ValidationMessage( " FirstName " " * " %>
    
</ p >
    
< p >
      
< label  for ="LastName" > LastName: </ label >
      
<% =  Html.TextBox( " LastName " %>
      
<% =  Html.ValidationMessage( " LastName " " * " %>
    
</ p >
    
< p >
      
< input  type ="submit"  value ="Create"   />
    
</ p >
    
</ fieldset >
<%  }  %>

 

以名字(FirstName)与姓氏(LastName)来说,

<% =  Html.TextBox( " FirstName " %>
<% =  Html.ValidationMessage( " FirstName " " * " %>

 

通过helperValidationMessage来验证FirstName文本框,然后如果验证不通过,则文本框后加显示*符号(就像平常注册的一样,必填项有些类似,当然做为字符串,可以改的)

然后在控制器的动作中,通过ModelState来验证:

if  (customer.FirstName  ==   string .Empty)
{
    ModelState.AddModelError(
" FirstName " " 名字不能为空! " );
}

if  (customer.LastName  ==   string .Empty)
{
    ModelState.AddModelError(
" LastName " " 姓氏不能为空! " );


if  (Convert.ToInt32(customer.FirstName)  >   10 )
{
    ModelState.AddModelError(
" FirstName " " 名字不能大于! " );


if  ( ! ModelState.IsValid)
{
    
return  View();
}

 

这个ModelStateController的一个属性:

public  ModelStateDictionary ModelState
{
    
get
    {
        
return   base .ViewData.ModelState;
    }
}

 

从这里可以看出:控制器的ModelState属性其实是ViewData的一个属性。看来ViewData用处真大(Model部分其实也是放到了这个属性中)。而ViewData是一个ViewDataDictionary 类型的。然后,这个类型的一个属性:就是ModelState,这个属性就是一个ModelStateDictionary 类型。它的方法很多,其中之一就是:

public   void  AddModelError( string  key,  string  errorMessage)
{
    
this .GetModelStateForKey(key).Errors.Add(errorMessage);
}

 

就是程序中用到的。其中GetModelStateForKey方法是得到一个ModelState类实例,ModelState类定义为:

public   class  ModelState
{
    
//  Fields
     private  ModelErrorCollection _errors;

    [CompilerGenerated]
    
private  ValueProviderResult  < Value > k__BackingField; 

    
//  Methods
     public  ModelState(); 

    
//  Properties
     public  ModelErrorCollection Errors {  get ; }
    
public  ValueProviderResult Value { [CompilerGenerated]  get ; [CompilerGenerated]  set ; }
}

 

当调用ModelState.AddModelError方法时:

·调用ControllerModelState属性

·调用ControllerModelState属性就是调用ControllerViewData属性的ModelState

·其实调用的就是ViewDataDictionary类的ModelState属性

·当添加错误信息时,就是调用ModelState属性的AddModelError方法,

其中ModelState属性是ModelStateDictionary类型

·当添加错误信息时,就是向ModelState类实例中Errors属性中添加kv对,也就是对ModelErrorCollection

添加错误信息

 

然后再提一下IsValid属性:

public   bool  IsValid
{
    
get
    {
        
return   this .Values.All < ModelState > ( delegate  (ModelState modelState) 
        {
            
return  (modelState.Errors.Count  ==   0 );
        });
    }
}

 

这下就一目了然了:验证数据后,会在ModelState

 

Post提交过来的数据被验证时,当有错误信息时,被添加到ModelState类实例的ModelErrorCollection集合属性中,然后控制器的ModelState属性的Values属性(ModelState类型),如果这个ModelState中的错误的信息的数目为0时,则验证通过,否则验证不通过。

 

当验证不通过时,不会执行创建动作中的IsValid之后的逻辑,而直接返回视图。这时,错误信息已经添加到了控制器的ViewData中。然后,在视图中显示。

(二)通过实现IDataErrorInfo接口

IDataErrorInfo 接口定义:

public   interface  IDataErrorInfo
{
    
//  Properties
     string  Error {  get ; }
    
string   this [ string  columnName] {  get ; }
}

 

如果要实现这个接口:

·partial类型的类实体中继承这个接口

·实现这个接口

·对数据进行验证时,只要实现[On属性Changing]即可

例如:我是直接在LinqToSql文件的Customer类中添加的接口(因为做了一个partial类,在别的地方写也是可以的,它表示可分写。)

public   partial   class  Customer : INotifyPropertyChanging, 
                                INotifyPropertyChanged, IDataErrorInfo

 

实现部分为:

#region  IDataErrorInfo 成员

private  Dictionary < string string >  _errors  =   new  Dictionary < string string > (); 

partial   void  OnFirstNameChanging( string  value)
{
    
if  (value.Trim().Length  ==   0 )
        _errors.Add(
" FirstName " " 名字不能为空. " );
    
else
    {
        
if  (Convert.ToInt32(value.Trim())  >   10 )
           _errors.Add(
" FirstName " " 不能大于10 " );
    }
}

partial   void  OnLastNameChanging( string  value)
{
    
if  (value.Trim().Length  ==   0 )
        _errors.Add(
" LastName " " 姓氏不能为空. " );   
}

public   string  Error
{
    
get
    {
        
return   string .Empty;
    }
}

public   string   this [ string  columnName]
{
    
get
    {
       
if  (_errors.ContainsKey(columnName))
            
return  _errors[columnName];
       
return   string .Empty;
    }
}

#endregion

 

这部分相当容易实现,一个Error属性,一个实现索引,添加对验证字段(文本框)的方法。即可,然后在控制器中:

//if (customer.FirstName == string.Empty)

//{

//    ModelState.AddModelError("FirstName", "名字不能为空!");

//}

 

这些部分就可以不要了。

 

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
|
SQL 数据库
PowerDesigner导出SQL脚本运行注释出现乱码问题
PowerDesigner导出SQL脚本运行注释出现乱码问题
403 0
|
11月前
|
编解码 前端开发 UED
HTML多媒体格式支持与优化
在HTML中,多媒体格式的支持与优化至关重要。使用`&lt;audio&gt;`、`&lt;video&gt;`和`&lt;img&gt;`标签可分别嵌入音频、视频和图像。支持的格式包括MP3、OGG、JPEG等。为优化体验,应压缩文件、采用响应式设计、使用懒加载,并考虑转码及CDN托管。此外,添加字幕和描述文件可提高辅助功能。遵循这些最佳实践,能显著提升多媒体内容的加载速度与用户满意度。
|
9月前
|
算法 决策智能
基于遗传优化算法的TSP问题求解matlab仿真
本项目使用遗传算法解决旅行商问题(TSP),目标是在四个城市间找到最短路径。算法通过编码、选择、交叉、变异等步骤,在MATLAB2022A上实现路径优化,最终输出最优路径及距离。
|
11月前
|
人工智能 自然语言处理 PHP
通义灵码体验评测
通义灵码体验评测
368 2
|
机器学习/深度学习 编解码 PyTorch
【YOLOv8改进】HWD: Haar小波降采样,用于语义分割的降采样模块,减少特征图的空间分辨率
YOLOv8专栏探讨了卷积网络的改进,特别是提出了一种名为HWD的基于Haar小波的下采样模块,用于语义分割,旨在保留更多空间信息。HWD结合了无损编码和特征表示学习,提高了模型性能并减少了信息不确定性。新度量标准FEI量化了下采样的信息保留能力。论文和代码可在提供的链接中找到。核心代码展示了如何在PyTorch中实现HWD模块。
|
11月前
|
域名解析 网络协议 网络安全
阿里云DDoS高防(中国内地)计费说明
阿里云DDoS高防(中国内地)计费说明
|
Linux Shell 调度
介绍BootLoader、PM、kernel和系统开机的总体流程
介绍BootLoader、PM、kernel和系统开机的总体流程
|
11月前
|
XML 缓存 前端开发
Electron-builder 是如何打包 Windows 应用的?
本文首发于微信公众号“前端徐徐”,作者徐徐深入解析了 electron-builder 在 Windows 平台上的打包流程。文章详细介绍了 `winPackager.ts`、`AppxTarget.ts`、`MsiTarget.ts` 和 `NsisTarget.ts` 等核心文件,涵盖了目标创建、图标处理、代码签名、资源编辑、应用签名、性能优化等内容,并分别讲解了 AppX/MSIX、MSI 和 NSIS 安装程序的生成过程。通过这些内容,读者可以更好地理解和使用 electron-builder 进行 Windows 应用的打包和发布。
643 0
|
存储 大数据 数据处理
解锁时间旅行新姿势!EMR DeltaLake 如何让你在大数据海洋中畅游历史,重塑决策瞬间?
【8月更文挑战第26天】DeltaLake是由DataBricks公司开源的大数据存储框架,专为构建高效的湖仓一体架构设计。其特色功能Time-Travel查询允许用户访问数据的历史版本,极大增强了数据处理的灵活性与安全性。通过独特的文件结构和日志管理机制,DeltaLake实现了数据版本控制。用户可通过指定时间戳或版本号查询历史数据。
167 2
|
Web App开发 存储 Linux
Linux Apache服务详解——Apache服务访问控制
Linux Apache服务详解——Apache服务访问控制
601 7