ASP.NET MVC驗證框架中關于屬性標記的通用擴展方法

作者: 深山老林  來源: 博客園  發布時間: 2010-10-13 19:51  閱讀: 2363 次  推薦: 0   原文鏈接   [收藏]  
摘要:本文將討論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

0
0
 
標簽:ASP.NET MVC 標記
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()