日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Silverlight驗(yàn)證機(jī)制主要內(nèi)容分析

Silverlight開發(fā)工具主要應(yīng)用于多媒體方面,可以幫助開發(fā)人員實(shí)現(xiàn)多平臺的音頻視頻處理,創(chuàng)建出一個(gè)適合開發(fā)需求的WEB應(yīng)用程序。我們將會在這篇文章中針對Silverlight驗(yàn)證機(jī)制做一個(gè)詳細(xì)的介紹。#t#

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),海晏企業(yè)網(wǎng)站建設(shè),海晏品牌網(wǎng)站建設(shè),網(wǎng)站定制,海晏網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,海晏網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

我們在項(xiàng)目中使用了Silverlight驗(yàn)證機(jī)制。一開始,感覺很不錯:可以用標(biāo)注的方式聲明驗(yàn)證邏輯,自動設(shè)置校驗(yàn)控件,自動驗(yàn)證數(shù)據(jù)——一切似乎很好。但是很快我發(fā)現(xiàn),Silverlight的校驗(yàn)機(jī)制也是存在嚴(yán)重限制的。

對于不熟悉Silverlight驗(yàn)證機(jī)制的朋友,我可以在這里作一個(gè)簡單的介紹。關(guān)鍵在于System.ComponentModel.DataAnnotations這個(gè)程序集,它提供了一些標(biāo)記屬性,你可以為實(shí)體添加這些標(biāo)記,然后在編寫實(shí)體讀寫方法的時(shí)候添加一些觸發(fā)校驗(yàn)邏輯的樁代碼,那么內(nèi)置有數(shù)據(jù)校驗(yàn)功能的控件(比如Label和DataForm等)就能自動識別、并按照你設(shè)定的值來進(jìn)行校驗(yàn)。

下面是從Pro Silverlight 3 for C#中摘抄的一段代碼。即使不看手冊,其中Silverlight驗(yàn)證機(jī)制規(guī)定的驗(yàn)證邏輯是很容易看懂的。

 
 
 
  1. [StringLength(25)]  
  2. [Display(Name = "Model Name", 
    Description = "This is the retail 
    product name.")]  
  3. public string ModelName  
  4. {  
  5. get { return modelName; }  
  6. set  
  7. {  
  8. ValidationContext context = new 
    ValidationContext(this, null, null);  
  9. context.MemberName = "ModelNumber";  
  10. Validator.ValidateProperty
    (value, context);  
  11. modelName = value;  
  12. OnPropertyChanged(new Property
    ChangedEventArgs("ModelName"));  
  13. }  

Silverlight驗(yàn)證機(jī)制看起來很簡單,而且我們使用的開頭一段時(shí)間內(nèi)運(yùn)行得也相當(dāng)不錯,省去了很多手工校驗(yàn)的工作。直到有一天我們創(chuàng)建了某個(gè)新實(shí)體的時(shí)候,麻煩來了。

問題是這樣的,項(xiàng)目需求要求我們保存某些客戶信息,其中Email是必須填寫的。實(shí)現(xiàn)此邏輯只要為屬性加上一個(gè)Required標(biāo)注即可。但問題在于,盡管Email是必須填寫的,但我們卻無法為它提供一個(gè)合理的默認(rèn)值,所以開始的時(shí)候此屬性是空字符串。另一方面,這個(gè)實(shí)體最初是從服務(wù)器端通過序列化得到的,而進(jìn)行序列化和反序列化的時(shí)候也會調(diào)用Setter,從而調(diào)用校驗(yàn)邏輯,拋出異?!@是我們不希望的行為。雖然不希望,我們卻不能去掉它,如果去掉的話,那么Silverlight的校驗(yàn)邏輯就不能工作了!

此問題的關(guān)鍵點(diǎn)在于,序列化的時(shí)候需要調(diào)用實(shí)體的Setter,界面綁定的時(shí)候也要調(diào)用Setter,但兩種情況下需要的行為卻是不同的。創(chuàng)建一個(gè)新實(shí)體的時(shí)候,其中某些屬性有可能是無效的,但我們并不能因此阻止用戶創(chuàng)建新對象,這時(shí)候是應(yīng)當(dāng)禁用驗(yàn)證邏輯的。 那么接下來的問題就是,實(shí)體的Setter中能不能識別到是在哪一種情況下調(diào)用的,從而打開或關(guān)閉驗(yàn)證呢?

開始我想到了Environment.StackTrace,根據(jù)調(diào)用堆棧來判斷運(yùn)行環(huán)境,應(yīng)該可以識別出代碼運(yùn)行的場合。但是實(shí)驗(yàn)一下就發(fā)現(xiàn):此路不通。StackTrace這個(gè)屬性在Silverlight版本的CLR中是根本沒有提供的,于是這個(gè)方向被堵死了。

有的組員提出,是否可以設(shè)置一個(gè)提示性的初始值,比如“<請?zhí)顚?”?這個(gè)建議很快被否決了,因?yàn)橐笥脩魜韯h掉無效的值再重新輸入并不合理,也不友好。

然后又有人說,是否可以根據(jù)實(shí)體的Id來判斷,如果是0則表示是新建的對象,不需要校驗(yàn)? 這也是不可行的,因?yàn)樾陆ǖ膶ο笤谔峤坏臅r(shí)候同樣需要校驗(yàn)。

當(dāng)然還有一個(gè)辦法是為界面綁定和數(shù)據(jù)傳遞分別生成兩套實(shí)體,一套有數(shù)據(jù)校驗(yàn),一套沒有,然后寫代碼來在它們之間進(jìn)行轉(zhuǎn)換。但是想想也可以知道,這樣工作量實(shí)在太大了,也增加了維護(hù)的難度。

最終我們采取了一個(gè)比較笨的辦法:為實(shí)體添加一個(gè)IsUIBinding標(biāo)志,一開始為false,在綁定到界面之前設(shè)置為true,提交服務(wù)器之前再復(fù)原為false。這樣是可以解決問題了,不過程序員的負(fù)擔(dān)就更重了——必須記住在合適的時(shí)候修改這個(gè)標(biāo)記,否則程序就會出現(xiàn)bug。

這個(gè)結(jié)果讓我對Silverlight驗(yàn)證框架感到有點(diǎn)遺憾。Silverlight的驗(yàn)證方法過于嚴(yán)格——一旦數(shù)據(jù)不合法,ValidationException就會拋出,于是所有后續(xù)代碼都無法執(zhí)行,如果運(yùn)行環(huán)境沒有做好處理此異常的準(zhǔn)備的話,那么整個(gè)程序都會出錯。而其他的場景——比如序列化的時(shí)候是沒有辦法處理此異常的,這大大限制了校驗(yàn)機(jī)制的應(yīng)用場景。

其實(shí)從設(shè)計(jì)上看,Silverlight驗(yàn)證機(jī)制使用了ValidationResult來收集校驗(yàn)失敗信息,那么理論上講,不使用異常,而根據(jù)ValidationResult收集的結(jié)果來判斷也是完全可能的。但最終Silverlight還是采用了異常的方法。不過盡管有此遺憾,Silverlight的校驗(yàn)機(jī)制對于一般的數(shù)據(jù)驗(yàn)證還是不錯的,目前我們也不太可能拋開它去完全實(shí)現(xiàn)一套自己的校驗(yàn)方法,只有在編程的時(shí)候多加注意了。


網(wǎng)站題目:Silverlight驗(yàn)證機(jī)制主要內(nèi)容分析
URL分享:http://m.5511xx.com/article/dhssoip.html