2013/06/12

20130612-程式-MVC Model的長度驗証擴充StringLengthAttribute Validate

這一段也來記錄一下,各個「拼裝」的歷程:

主要達到的功能是: (都用貼圖的比較快)
1. 我Model上的驗証有這些


在Client 端要額外達到:
a. 當有加 StringLength 時,則 input:text 要限制 maxlength
b. 中文長度=2byte,英文長度=1byte。
    (即 驗証部份:max=10,表示:中文5個字;若中文計算後超過就算驗証不過)

在Server端要額外達到:
a. 程式只要寫 model.Validate()  即自動驗証它的屬性。
b. 一樣依 Model上的StringLengthAttribute 判斷"中英文"長度是否有超過?

====================================
在開發中,遇到要去找的問題:(拼裝解法)
在Client 端:
a. 因MVC 的Client驗証 (會自動將Model上的Attribute轉成 Html attribute)
    所以,我要直接由 jquery 取得它,再將各element加上 maxlength 的html attribute
b. 當summit 時,原本的字串長度驗証,我要讓它可以判斷" 中英文"。

在ApService端:
a. 要利用System.ComponentModel.DataAnnotations 下東西,達到像 MVC 的Controller 的model Validator一樣處理。
(參考這篇:Validation Using Data Annotation to Custom Model or Class)
b. 要override 原本的 StringLengthAttribute 的長度驗証(讓它可以判斷中英文)

======================================
在判斷中英文:jquery / C# 的寫法,這篇資訊很有用(copy from Y2J http://goo.gl/UuTk9 )


======================================
在Client 端:

=>直接找到具有這 [data-val-length-max]的屬性 (由 jquery.validate.unobtrusive.js產生)
    加上 maxlength 屬性。
註1:$('input[XXX]'),這樣的CSS Selector 是可以直接選出該tag 且具有XXX屬性的
註2:$(con).attr()是取得;$(con).attr(XXX)是設定。

結果:達到 限制 User Key的長度。(但是無法區分中英文)
=====


=> 這部份我那時一直想,怎麼去找到它的string length 驗証?結果在jquery.validate.js下
    它有各自的驗証方式。
所以, override jquery.validate.js 它的 javascript function ,以達到我要的驗証。


============================================
Client 端的驗証,在星期二時把它寫完,再來就是今天星期三,把ApServer端的給弄出來。
=============================================

之前就看到這一篇文章,它把在ApService 針對Model 的驗証寫了出來


所以,就先仿它的寫法,再整理成以下的結果,
讓它可以直接使用:model.Validate()
而其中的 EntityValidationResult是 包裝過的:


最主要的Validate()



這部份,就直接是對 IModel 的物件做擴充,
public static void Validate<T>(this T model) where T : IModel

=============
再來就是 override 原 StringLengthAttribute的驗証:


原來直接命 "同名" 就可以了;因為在使用時,它會先以Namespace為優先
所以額外加上 中英文 判斷。


===========================================
心得:

這樣的功能拼裝終於完成,但因為都是到處到網上找資訊,所以較無法深刻地記住
所以透過Blog記錄,以防之後忘記。

技術上是需要時間做學習的。
當你有時間,就可以好好了解這東西,並研究它,不要常常只是快快交差而已。

自學是很重要的,時間充份運用些!!

(THE END)



0 意見 :

張貼留言