MVC中简单数据验证

Entity FrameworkEF)提供了非常方便的建立数据库模型的方法,而且利用模型的partial class的特性可以衍生出自定义数据结构,这样便方便了本文所讲的数据validate的简单应用。如有错误请大家指出,本人也处于初学阶段,希望能共同进步。 


1.建立一个ADO.NET Entity Data Model 详细的方法网上很多,这里便不介绍了

 

新建出一个数据模型 ContactManagerModel.edmx 查看ContactManagerModel.Designer.cs 里面的结构可以看出EF自动将数据库的设计和视图等都实例化成一个个方法,而整个数据库实例化成一个 partial class (部分类)也就是说一个类可以将不同的方法分布到几个文件中,具体好处见=>这里

 2.建立一个文件用于实现数据模型中部分类 Contactpartials.cs 

 

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

namespace BLL
{
    [MetadataType(
typeof(Contactpartials))]
    
public partial class Contact
    {
        
public class Contactpartials
        {
            [Required(ErrorMessage 
= "名不能为空")]
            [StringLength(
50,ErrorMessage="长度不能超过50")]
            
public string FirstName { getset; }
            
            [Required(ErrorMessage 
= "姓不能为空")]
            [StringLength(
50,ErrorMessage="长度不能超过50")]    
            
public string LastName { getset; }
            
            [Required(ErrorMessage 
= "电话不能为空")]
            [StringLength(
50, ErrorMessage = "长度不能超过50")]
            
public string Phone { getset; }

            [Required(ErrorMessage 
= "Email不能为空")]
            
public string Email { getset; }
        }
    }
}

  

由于FirstName等成员已经在数据模型中定义所以无法直接添加,便加入MetadataType功能,这样便能对已定义的成员进行再次定义(这样的说法似乎不合理@@)

从上面的代码我们可以看到

            [Required(ErrorMessage = "名不能为空")]
            [StringLength(50,ErrorMessage="长度不能超过50")] 

 

 这样的代码,这就是DataAnnotations(数据标签)的方便所在,ASP.NET MVC 2 允许开发人员轻松地在模型或视图模型类上添加声明式验证特性,然后ASP.NET MVC在应用中实施模型绑定操作时,这些验证规则就会被自动执行。(需要引用和using System.ComponentModel.DataAnnotations)

 3.建立一个简单的MVC 项目

 

  建立Edit的视图 我们便以Edit视图为例子讲解数据验证。通过第一步和第二步的设置,目前对于修改数据时的数据验证已经实现然我们看下效果

4.客户端验证

由于目前的验证是建立在点击save后才能开始验证就是将表单提交到服务器才能看到错误信息,这样不仅加大服务器压力,而且还浪费时间,MVC2.0给我们提供了一个非常方便的东西,他同时支持服务端和客户端验证。我们要做的事情非常简单,在文件中加入 

     <script src="<%= Url.Content("~/Scripts/MicrosoftAjax.debug.js") %>" type="text/javascript"></script>
     
<script src="<%= Url.Content("~/Scripts/MicrosoftMvcAjax.debug.js") %>" type="text/javascript"></script>
     
<script src="<%= Url.Content("~/Scripts/MicrosoftMvcValidation.debug.js") %>" type="text/javascript"></script>
     
<% Html.EnableClientValidation();%>

  这样在点击save之前便能得知自己输入的数据是否符合要求。(似乎数据错误的话 提交按钮直接无视了-_-!)

 

5.Email的validate

 System.ComponentModel.DataAnnotations 有着很多的内置验证特征,可是怎么就没有Email的呢!!所以只能自己建立一个验证类

代码
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
    
public class EmailAttribute : RegularExpressionAttribute
    {

        
public EmailAttribute()
            : base("(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])")
        {
        } 
    }

 正则表达式 可能不是很好,不过网上有很多更好的(我看到过1个Email的正则表达式占了整整一页@@) 

在加了这样的类后 Email这个成员便能带上一个非常和谐的帽子了

            [Required(ErrorMessage = "Email不能为空")]
            [Email(ErrorMessage = "不是有效地Email地址")]
            
public string Email { getset; }

 

 多么和谐 多么简单,然而这样加还不是我们的目的,我们要实现客户端验证!因为仅仅这么加一个验证类,客户端还不认识我们,这个可以从页面的源代码看到,其他的像required之类都在页面上留下js命令了,就是这个Email没有,很是郁闷,so我们来加入这样的语句(在EmailAttribute 这个类中)

         static EmailAttribute()  
        {  
            DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAttribute), typeof(RegularExpressionAttributeAdapter));  
        }  

  这样便能让客户端认识我们了,让我们看下源代码吧 

代码
<script type="text/javascript"> 
//<![CDATA[
if (!window.mvcClientValidationMetadata) { window.mvcClientValidationMetadata = []; }
window.mvcClientValidationMetadata.push({
"Fields":[{"FieldName":"FirstName","ReplaceValidationMessageContents":true,"ValidationMessageId":"FirstName_validationMessage","ValidationRules":[{"ErrorMessage":"长度不能超过50","ValidationParameters":{"minimumLength":0,"maximumLength":50},"ValidationType":"stringLength"},{"ErrorMessage":"名不能为空","ValidationParameters":{},"ValidationType":"required"}]},{"FieldName":"LastName","ReplaceValidationMessageContents":true,"ValidationMessageId":"LastName_validationMessage","ValidationRules":[{"ErrorMessage":"长度不能超过50","ValidationParameters":{"minimumLength":0,"maximumLength":50},"ValidationType":"stringLength"},{"ErrorMessage":"姓不能为空","ValidationParameters":{},"ValidationType":"required"}]},{"FieldName":"Phone","ReplaceValidationMessageContents":true,"ValidationMessageId":"Phone_validationMessage","ValidationRules":[{"ErrorMessage":"长度不能超过50","ValidationParameters":{"minimumLength":0,"maximumLength":50},"ValidationType":"stringLength"},{"ErrorMessage":"电话不能为空","ValidationParameters":{},"ValidationType":"required"}]},{"FieldName":"Email","ReplaceValidationMessageContents":true,"ValidationMessageId":"Email_validationMessage","ValidationRules":[{"ErrorMessage":"Email不能为空","ValidationParameters":{},"ValidationType":"required"},{"ErrorMessage":"不是有效地Email地址","ValidationParameters":{"pattern":"(?:[a-z0-9!#$%&\u0027*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&\u0027*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"},"ValidationType":"regularExpression"}]}],"FormId":"form0","ReplaceValidationSummary":false});
//]]>
</script> 

 

6.上传我的代码里面包括了Enterprise Library(EL)的2个功能Logging和Validation学习用~比较了EL的Validation和MVC的数据验证,我感觉还是MVC的用的爽~在Create视图中我用EL的Validation Edit用的是 MVC的Validation 为了区分我将EL的FirstName字段的长度限制为20 这样就能看到不一样的地方啦。

如果Logging部分报错的可以删掉或者自己建立一个Logging的数据库或者是到这里看看,会有帮助的~

源码在此 ->下载

 

在我写完这文章的时候,看到了某大牛的一篇文章 功能有点像但他语言比我好多了 ORZ一下~

 希望这篇文章能对你有所帮助,感谢大家!

 

posted on 2010-06-23 15:58  蓝炎蛮蛮  阅读(541)  评论(0)    收藏  举报

导航