软件下载 | 资讯教程 | 最近更新 | 下载排行 | 一键转帖 | 发布投稿
您的位置:最火下载站 > 网络编程 > ASP.NET > ASP.NET MVC验证框架中关于属性标记的通用扩展方法

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

  之前写过一篇文章《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许可证。

 

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

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

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

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

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

Copy to ClipboardLiehuo.Net Codes引用的内容:[www.veryhuo.com]
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;}
}

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

Copy to ClipboardLiehuo.Net Codes引用的内容:[www.veryhuo.com]
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类进行扩展,扩展类的定义如下:

扩展类的定义 
Copy to ClipboardLiehuo.Net Codes引用的内容:[www.veryhuo.com]
[MetadataType(typeof(UserMetadata))]
public partial class User
{

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

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

Copy to ClipboardLiehuo.Net Codes引用的内容:[www.veryhuo.com]
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; }
}

}

相关阅读
网友评论
栏目导航
推荐软件