zoukankan      html  css  js  c++  java
  • 一起谈.NET技术,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框架,通过如下两个程序集就可以看出来:

    xVal.RulesProviders.CastleValidator.dll
    xVal.RulesProviders.NHibernateValidator.dll

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

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

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

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

    模拟EF中的User类

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

    伙伴类的代码

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

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

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

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

    整体代码

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

    DataAnnotationsValidationRunner类的代码

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

    Controller层的代码

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

    View层的代码

       最终的效果如下图所示:

     

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

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

     代码下载

      【参考文章】:

     《Using MetadataType attribute with ASP.NET MVC xVal Validation Framework

  • 相关阅读:
    wp8模拟器中使用电脑键盘和模拟器的版本解释
    程序员如何正确的评估自己的薪资
    本地资源之绑定页面的标题和增加软件的语言支持
    C#导出数据的EXCEL模板设计
    程序员高效编程的14点建议
    使用StaticResource给控件定义公共的样式和属性来写界面XAML
    程序员什么时候该考虑辞职
    我的第一个wp8小程序
    检测CPU是否支持虚拟化
    所有经历都是一种恩赐
  • 原文地址:https://www.cnblogs.com/waw/p/2162787.html
Copyright © 2011-2022 走看看