前幾篇把asp.net mvc3 中基於Model的主要資料驗證的方法都已經講完了,本節純粹只是講一個我曾經遇到的問題,因為和資料驗證相關,所以就放在了這系列的文章中。 經過前幾篇文章的分享,大家應該覺得asp.net 內建的Remote遠端資料註解比較好用,但是我在實際使用中卻遇到了問題。 首先,一般來說對於一個屬性的驗證可能需要不止一個的遠程驗證,比如對於使用者名稱來說,我們需要對於它的長度做一些限制,這個可以通過StringLength特性來解決;同時還需要驗證使用者名稱不能重複,這個就需要通過Remote特性來解決。 現在需要再添加一個驗證,那就是使用者名稱不能包含違禁詞。比如......(比較敏感,就不寫了。。。^_^),違禁詞儲存在資料庫中。剛開始我覺得這個也簡單,再加個Remote驗證不就解決了麼。。。童鞋們,有時候我們覺得很簡單就能辦到的事情,如果不做,永遠不知道你能不能辦到。所以建議大家,遇到事情不要拖拉,儘快做好。 劈裡啪啦,很快就把驗證的方法寫好了,然後加到Model中一看傻眼了。。。 原來不支援同一個屬性有兩個Remote驗證。。。 這個時候該怎麼辦呢,嘗試將兩個驗證寫在同一個Remote中,但是這樣的話只能顯示一個ErrorMessage,被否決。(但是的我以為Remote特性的方法只能返回一個bool值,不能返回ErrorMessage)。 然後我就在cnblogs、csdn以及百度知道發帖詢問,大多數的回答沒有說到重點。 由於時間緊(也不是因為時間緊,總不能讓這麼一個小驗證跟經理說搞個一整天吧),所以就自己寫了個自訂驗證解決。 事情雖然是解決了,但是總覺得微軟設計的時候總不會這麼傻叉,連這點都沒想到。但是查資料也沒查到啥,之後就一直放著。 直到昨天,csdn上的一哥們說Remote驗證可以自訂ErrorMessage,我才恍然大悟,我原來一直以為只能返回true或false的。 接下來就很簡單了,花了5分鐘的時間找到了返回ErrorMessage的方法,原來驗證為false時不用返回bool值,可以直接返回ErrorMessage。方法如下:
public JsonResult CheckUserName(string userName) { if (IsUniqueName(userName) && IsForbiddenName(userName)) { return Json(true, JsonRequestBehavior.AllowGet); } else if (!IsUniqueName(userName)) { return Json("使用者名稱不唯一!", JsonRequestBehavior.AllowGet); } else { return Json("使用者名稱不包含違禁詞!", JsonRequestBehavior.AllowGet); } }
這樣就可以完美解決需要多個Remote驗證的問題了。 雖然問題解決了,但是仍然要吐槽下微軟,幹嘛不能多個Remote驗證,吧這麼多的邏輯都放在一個方法中容易繞暈額。。。 雖然這是個小問題,但是從中至少得到了兩點啟示: 1、看到的問題不可怕,可怕的是有問題但是我們沒有看到; 2、很多事情,只要你堅持,總會等到柳暗花明的一天。 asp.net mvc3 資料驗證的前幾篇文章:asp.net mvc3 的資料驗證(一) asp.net mvc3 資料驗證(二)——錯誤資訊的自訂及其本地化 asp.net mvc3 資料驗證(三)—自訂資料註解