首页 技术 正文
技术 2022年11月16日
0 收藏 918 点赞 3,796 浏览 3111 个字

http://www.cnblogs.com/wlb/archive/2009/12/01/1614209.html

之前写过一篇文章《ASP.NET MVC中的验证》,唯一的遗憾就是在使用Data Annotation Validators方式验证的时候,如果数据库是Entityframework等自动生成的文件,就没有办法使用扩展属性标记进行标记。现在已经开始有了一些其它的Asp.net MVC 验证框架,使用上跟Data Annotation Validators差不太多,但是普遍有这样的问题,如果数据库是Entityframework生成的edm文件,没有办法进行扩展属性标记。

今天在网上发现了另外一个 Asp.net MVC 验证框架—xVal框架,使用上跟Data Annotation Validators非常接近,也有类似的问题。

简单介绍下,xVal是一个开源的asp.net mvc验证框架,有关它的介绍,可以参考:《xVal – a validation framework for ASP.NET MVC

xVal使用了MS-PL的开源协议 ,也就是说,它允许用户看、修改和分发源代码,而不论出自商业用途还是非商业用途,类似BSD许可证。

ASP.NET MVC验证框架中关于属性标记的通用扩展方法

xVal可以通过IRulesProvider接口,通过这个接口可以进行扩展,很明显,它只扩展了Castle框架跟NHibernate框架,通过如下两个程序集就可以看出来:

  1. xVal.RulesProviders.CastleValidator.dll
  2. xVal.RulesProviders.NHibernateValidator.dll

基本上可以得出结论:xVal没有提供对Entityframework框架的扩展,还需要我们做扩展。

最终,网上的一片文章给了我提示,问题得到了解决,解决的思路就是建立一个伙伴类,这个伙伴类跟原来的类的结构定义是一样的,在进行验证的时候,不对edm文件中的类进行验证,而是对伙伴类进行验证。

这里就以xVal框架为例进行Demo演示吧。

首先我们建立一个类模拟Entityframework生成的edm文件中的类,类的定义代码如下:

模拟EF中的User类

接下来我们建立一个伙伴类

伙伴类的代码public class UserMetadata
    {
        [Required]
        [StringLength(10)]        public string UserName { get; set; }        [Required]
        [StringLength(18)]
        [DataType(DataType.Password)]
        public string Password { get; set; }        [Required]
        [StringLength(100)]
        public string Address { get; set; }        [Required]
        [DataType(DataType.PhoneNumber)]
        public string Telephone { get; set; }        [Required]
        [Range(1, 100)]
        public int Age { get; set; }        [Required]
        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }
    }

再接下来,我们使用partial关键字为User类进行扩展,扩展类的定义如下:

扩展类的定义    [MetadataType(typeof(UserMetadata))]
    public partial class User
    { 
        
    }

注意这段代码:[MetadataType(typeof(UserMetadata))]

为了方便大家阅读,我把整体代码贴出来,整体代码如下:

整体代码using System.ComponentModel.DataAnnotations; namespace MVCValidate.Models
{
    public partial class User
    {
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Address { get; set; }
        public string Telephone { get; set; }
        public int Age { get; set; }
        public string Email { get;set;}
    }    [MetadataType(typeof(UserMetadata))]
    public partial class User
    { 
        
    }
    public class UserMetadata
    {
        [Required]
        [StringLength(10)]        public string UserName { get; set; }        [Required]
        [StringLength(18)]
        [DataType(DataType.Password)]
        public string Password { get; set; }        [Required]
        [StringLength(100)]
        public string Address { get; set; }        [Required]
        [DataType(DataType.PhoneNumber)]
        public string Telephone { get; set; }        [Required]
        [Range(1, 100)]
        public int Age { get; set; }        [Required]
        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }
    }}

接下来,我们要实现伙伴类跟原类的替换方法了,代码如下所示:

DataAnnotationsValidationRunner类的代码

完成以上的代码以后,大部分工作就完成了,接下来,我们在Controller中编写一个create方法,来模拟Create操作,代码如下所示:

Controller层的代码

接下来,编写View层的代码,比较简单,我就直接贴出来了,代码如下:

View层的代码

最终的效果如下图所示:

ASP.NET MVC验证框架中关于属性标记的通用扩展方法

Asp.net mvc开源验证框架非常的多,只是有相似问题的更多,有了这个通用的方法,就可以很容易对其他验证框架进行扩展了。

最后,为了方便大家学习,代码我进行了打包,下载地址在这里:

代码下载

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,075
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,551
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,399
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,176
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,811
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,892