五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > ASP.NET MVC數(shù)據(jù)驗(yàn)證

ASP.NET MVC數(shù)據(jù)驗(yàn)證

文章來源:365jz.com     點(diǎn)擊數(shù):390    更新時(shí)間:2009-09-17 10:30   參與評論

關(guān)于ASP.NET MVC的驗(yàn)證,用起來很特別,因?yàn)?/span>MS的封裝,使人理解起來很費(fèi)解。也可能很多人都在Scott Guthrie等人寫的一本《ASP.NET MVC 1.0》書中,見過NerdDinner項(xiàng)目中對Dinner對象修改和添加的時(shí)的數(shù)據(jù)驗(yàn)證。但有許多封裝的地方,不知道是怎樣的工作原理,今天研究了,拿出來給大家分享一下。

數(shù)據(jù)庫還是上一篇blog中的庫與表,同樣的方法來創(chuàng)建news表的實(shí)體類,在自動(dòng)生成的news這個(gè)實(shí)體類中,我們發(fā)現(xiàn)有一個(gè)特殊的分部方法:

partial void OnValidate(System.Data.Linq.ChangeAction action);

這個(gè)方法沒有實(shí)現(xiàn),我們根據(jù)C#的語法知道,如果分部類中的分部方法,沒有實(shí)現(xiàn)的話,調(diào)用和定議的地方都不會起什么作用?,F(xiàn)在,我們要去完善這個(gè)方法,讓它“用”起來。

首先,人產(chǎn)在Models中創(chuàng)建news類的另一部分,代碼如下:

Code

在這里給出這么多代碼,其實(shí)是提前有設(shè)計(jì)的,因?yàn)閺臉I(yè)務(wù)角度考慮,還不應(yīng)該寫這部分代碼。RuleViolation類很簡單,就是一個(gè)包括了兩個(gè)屬性的類(這個(gè)類的結(jié)構(gòu)設(shè)計(jì)是根據(jù)后面的ModelState.AddModelError主法來設(shè)計(jì)的)。

news分部類中,有一個(gè)IsValid的屬性,這個(gè)屬性是bool類型的,返回值取決于GetRuleViolations這個(gè)方法,這個(gè)方法返回值是一個(gè)IEnumerable<RuleViolation>類型的,IEnumerable是通過news的幾個(gè)屬性是否為空來生成跌代的。如果titlecontentsNull””,就返回跌代。其實(shí)真正的用戶數(shù)據(jù)的驗(yàn)證就是在這里實(shí)現(xiàn),用戶的數(shù)據(jù)的對與錯(cuò),就是一個(gè)邏輯,只要用戶數(shù)據(jù)不符合規(guī)則,就可以 “yield return new RuleViolation("錯(cuò)誤標(biāo)識","錯(cuò)誤提示信息!");這里的錯(cuò)誤碼提示信息是顯示到客戶端的,所以要處理好友好的提示。

現(xiàn)在驗(yàn)證用戶數(shù)據(jù),生成錯(cuò)誤列表的工作都做完了,但關(guān)鍵是怎么能讓用戶提交數(shù)據(jù)時(shí),調(diào)用OnValidate。這個(gè)問題,先放一下,請記住,上面的代碼,只要在用戶提交數(shù)據(jù)時(shí),調(diào)用OnValidate,這樣就能得到錯(cuò)誤集合。

現(xiàn)在,讓我們來處理CotrollerView層,在Cotroller層,首先來添加index這個(gè)Action,代碼如下:

1public ActionResult Index()
2        {           
3            var NewsList = DCDC.news.Select(newss=>newss);
4            return View(NewsList );
5     }

6

這個(gè)Action返回所有news表中的記錄。

對應(yīng)的View如下:

Code

代碼中,需要我們注意是的    <%= Html.ActionLink("Edit", "Edit", new { id=item.ID }) %>

因?yàn)橐獙?dǎo)航到EditView,把以接下來我們創(chuàng)建EditActionView(因?yàn)樵诰庉嫈?shù)據(jù)時(shí),要用到驗(yàn)證,Edit才是我們的重點(diǎn))。

1 public ActionResult Edit(int id)
2        {
3            var list = DCDC.news.Single(newss=>newss.ID ==id);
4            return View(list);
5     }

6

 

<%= Html.ActionLink("Edit", "Edit", new { id=item.ID }) %>中的id會被當(dāng)成參數(shù)送到EditControllerEdit(int id)Action,成為Edit方法的實(shí)參。

Edit.aspx頁面如下圖:


對應(yīng)EditAction生成view,代碼如下:



 

Code

 

如果要單擊“更新”返回?cái)?shù)據(jù)新數(shù)據(jù),還需要我們寫如下一個(gè)Action

 

Code

 

這個(gè)EditAction是用戶提交返來更新數(shù)據(jù)庫的,我們可以從formValuews得到用戶在頁面上更新的數(shù)據(jù),來更新Sig_news對象,然后調(diào)用DCDC.SubmitChanges();去更新數(shù)據(jù)庫,如果沒有民常,會導(dǎo)航到index.aspx頁面。如果發(fā)生異常,就會運(yùn)行到catch里。如果還記得,在本文的前半部分,我們說到OnValidate,是數(shù)據(jù)在提交時(shí)應(yīng)該驗(yàn)證,但在這里,我們并沒有顯示的調(diào)用OnValidate這個(gè)方法,但實(shí)際運(yùn)行中,我們發(fā)現(xiàn),這個(gè)方法被執(zhí)行了,如果我們建立跟蹤,把斷點(diǎn)設(shè)在DCDC.SubmitChanges();如果我們數(shù)據(jù)有民常,會發(fā)現(xiàn)當(dāng)DCDC.SubmitChanges();執(zhí)行完后就會跳到partial void OnValidate(System.Data.Linq.ChangeAction action)這個(gè)方法,這是怎么做到的呢?我們猜測,一定是在數(shù)據(jù)提交時(shí),調(diào)用OnValidate這個(gè)方法。為了找到它們的關(guān)系,只好用Reflector.exe來“探測”一下了(Reflector.exe的用法就不說了)。

SubmitChanges方法是DataContext的一個(gè)方法,這個(gè)類位于System.Data.Linq命空間下,用Reflector.exe打開SubmitChanges,看到this.SubmitChanges(ConflictMode.FailOnFirstConflict);定位這個(gè)方法,可以看到new ChangeProcessor(this.services, this).SubmitChanges(failureMode);定位查找會發(fā)現(xiàn)ValidateAll(orderedList);在這個(gè)方法中,多處看到 SendOnValidate(obj2.Type, obj2, ChangeAction.Insert);這個(gè)方法,再定位,有這樣一行代碼 type.OnValidateMethod.Invoke(item.Current, new object[] { changeAction });這里,正是通過反射調(diào)用了OnValidate這個(gè)方法。這樣我們就找到了SubmitChanges執(zhí)行時(shí)調(diào)用OnValidate的方法了(其不用調(diào)用OnValidate也可以驗(yàn)證用戶數(shù)據(jù),只需要寫個(gè)方法,在SubmitChanges 提交以前執(zhí)行就可以達(dá)到同樣效果)。同時(shí),當(dāng)發(fā)生異常時(shí),OnValidate會拋出一個(gè)Application的異常,這里會被public ActionResult Edit(int id,FormCollection formValuews)方法中的Catch捕獲到,就執(zhí)行如下代碼:

Code

這行代碼的意思是把錯(cuò)誤的信息,以鍵值的方式放入ModelState中,ModelState是一個(gè)ModelStateDictionary類型,這個(gè)類型實(shí)現(xiàn)了IDictionary<string, ModelState>, ICollection<KeyValuePair<string, ModelState>>, IEnumerable<KeyValuePair<string, ModelState>>, IEnumerable這些接口(這里要注意,ModelState是當(dāng)前對象的一個(gè)屬性,并且它的AddModelError方法的第一個(gè)參數(shù)key有其獨(dú)特的作用)。處理完異常后,還是返回當(dāng)前頁面。這時(shí)你會發(fā)現(xiàn),在頁面的   <%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>發(fā)生了變化,把我們錯(cuò)誤的地方去提示出來了,這里就是,為什么我們把錯(cuò)誤信息放到ModelState中,而錯(cuò)誤則顯示在了Html.ValidationSummary中了呢?并且發(fā)生錯(cuò)誤的數(shù)據(jù)后會加上了一個(gè)紅色的“*”,這是怎么樣做到的呢?

再次利用Reflector.exe,查看Html.ValidationSummary方法和Html.ValidationMessage方法,會發(fā)現(xiàn)它們顯示的數(shù)據(jù)是從ModelState 中獲取的,如果ModelState 這個(gè)集合中沒有數(shù)據(jù),Html.ValidationSummaryHtml.ValidationMessage就返回空,如果發(fā)生異常,this.ModelState中有子項(xiàng),就會通過Html.ValidationSummaryHtml.ValidationMessage在頁面頁上顯示出來。因?yàn)?/span>Html.ValidationMessage在頁面上有多個(gè),所以在this.ModelState.AddModelError(v.PropertyName,v.ErrorMessage);方法中的v.PropertyName就有了用處了,這個(gè)值要與<%= Html.ValidationMessage("題目", "*")%>中的第一個(gè)參數(shù)對應(yīng),這樣<%= Html.ValidationMessage("題目", "*")%>才能起到作用,顯示出第二個(gè)參數(shù)“*”。

這樣一來,就達(dá)到了ASP.NET MVC的數(shù)據(jù)驗(yàn)證。由于ASPNET MVC 驗(yàn)證捌的彎比較多,所以下來用個(gè)圖來說明一下。




源碼:/Files/axzxs2001/MvcCompany.rar

如對本文有疑問,請?zhí)峤坏浇涣髡搲瑥V大熱心網(wǎng)友會為你解答??! 點(diǎn)擊進(jìn)入論壇

發(fā)表評論 (390人查看,0條評論)
請自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
昵稱:
最新評論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號