欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

ASP.NET MVC模型綁定的6個建議

系統 2764 0

ASP.NET MVC中的Model Binding使用起來非常簡單。你的Action方法需要數據,在傳入的HTTP請求中攜帶著你需要的數據,數據可以在請求的表單數據中,還可能在你的URL地址本身中。通過DefaultModelBinder,可以神奇地將表單中的數據和路由中的數據轉換到對象中。Model Binder使得你的控制器代碼可以干凈地從請求以及關聯的環境中分離出來。

ASP.NET MVC模型綁定的6個建議

這里有一些關于在MVC項目中更好使用Model Binding的建議。

Tip#1:最好使用Model Binding而不是Request.Form

如果你的Action像下面這樣:

    
  1. [AcceptVerbs(HttpVerbs.Post)]
  2. publicActionResultCreate()
  3. {
  4. Recipe recipe = new Recipe();
  5. recipe.Name = Request .Form["Name"];
  6. //...
  7. returnView();
  8. }

就不對了。這些屬性使得你的Action很難讀而且更難以測試,Model Binder可以幫你從Request和HttpContext中擺脫出來。比如,你可以使用FormCollection類型的參數來代替上面的代碼:

    
  1. publicActionResultCreate(FormCollectionvalues)
  2. {
  3. Recipe recipe = new Recipe();
  4. recipe.Name = values ["Name"];
  5. //...
  6. returnView();
  7. }

使用FormCollection你可以不必再深入到Request對象,這樣,有時候你就可以使用低層次的控制了。但是,如果你的數據來自Request.Form,或者URL請求參數,你可以通過Model Binding來完成它的魔術。

    
  1. [AcceptVerbs(HttpVerbs.Post)]
  2. publicActionResultCreate(RecipenewRecipe)
  3. {
  4. //...
  5. returnView();
  6. }

在這個例子中,Model Binder將會幫你創建newRecipe對象,并且使用從Request中獲得獲得的數據來填充它,真的是魔術。有許多的途徑允許你定制綁定的處理過程,使用白名單,黑名單,前綴,以及接口,更多的控制還允許你通過UpdateModel和TryUpdateModel方法進行,只是要注意無意的綁定??匆豢碕ustin Etheredge的文章 Think Before You Bind .

Tip#2定制Model Binder

在MVC中,Model Binding也是一個擴展點。如果默認的綁定不合適的話,你可以提供一個自定義的Model Binder,實現自定義的Model Binder你需要實現接口IModelBinder,這是僅有的一個方法,有多難嗎?

    
  1. publicinterfaceIModelBinder
  2. {
  3. objectBindModel(ControllerContextcontrollerContext,
  4. ModelBindingContextbindingContext);
  5. }

一旦你進入Model Binding,實際上,你將會發現這個簡單的IModelBinder接口并沒有完全描述在框架中的默認契約和負作用。如果你退回一步看一看,就會發現Model Binder,ModelState以及HtmlHelper。

Scott Hanselman在他的“ Splitting DateTime – Unit Testing ASP.NET MVC Custom Model Binders ”中給出了一個并不是演示版的Model Binder,一個我需要提出來的細節是Scott的DateTime分離器仍然沒有通過Request.Form來綁定,在GetA<T> 方法中,你將會看到Scott使用了上下文對象的ValueProvider屬性來獲得數據,ValueProvier表示混合了表單數據,路由數據,以及請求參數數據的數據。Scott的例子非常棒,但是,少了一個細節:綁定中的錯誤。

如果默認的模型綁定器在將數據綁定到你的對象上時出現了問題,它會將錯誤信息和錯誤的數據壓入到ModelState中,你可以檢查ModelState.IsValid來檢查綁定中的問題,使用ModelState.AddModelError 方法可以注入你自己的錯誤信息。

如果你看看Scott文章的回應,你會看到 Sebastien Crocquesel’s 對這個問題的補丁。如果轉換失敗,Sebastien的代碼將會使用ModelState.AddModelError方法來表示錯誤。Controller和View都會使用ModelState來檢查綁定的問題。Controller需要檢查ModelState,以便在將數據保存到數據庫之前檢查錯誤,而View需要通過ModelState來為用戶提供驗證的回應。需要注意的一點是HtmlHelper,你需要同時提供一個值,通過ModelState.SetModelValue,并且提供錯誤信息,通過AddModelError,否則你將會得到一個運行時的空引用異常,下面的代碼演示了這個問題。

    
  1. [AcceptVerbs(HttpVerbs.Post)]
  2. publicActionResultCreate(FormCollectionForm)
  3. {
  4. //thisisthewrongapproach...
  5. if(Form["Name"].Trim() .Length ==0)
  6. ModelState.AddModelError("Name","Nameisrequired");
  7. returnView();
  8. }

上面的代碼創建了一個模型的錯誤信息,但是沒有提供值。也有其他的問題,但是,如果你像下面一場呈現視圖,那么,就會得到一個異常。

<%= Html.TextBox( "Name" , Model.Name) %>

縱然你為 Model.Name 提供了一個值,HtmlHelper 也會發現錯誤,然后顯示試圖的值。如果你沒有提供值,就會看到一個空引用異常。

Tip#3通過繼承來自定義Model Binding

如果你決定實現一個自定義的Model Binder,你可能希望通過從DefaultModelBinder繼承來減少部分工作量,其實,最終你會發現不能通過繼承DefaultModelBinder 來達到你的目的。例如,假如你希望通過自定義的 ModelBinder來創建某些對象,DefaultModelBinder將會使用Activator.CreateInstance和Model的默認構造函數來創建對象,如果你的模型沒有提供默認的構造函數,你可以重寫CreateModel方法來解決這個問題。

Jimmy有一篇關于使用DefaultModelBinder的派生類的帖子“ A Better Model Binder ”.

Tip#4使用注解來完成驗證

Brad Wilson在他的文章 DataAnnotations and ASP.NET MVC 中,完美地演示了一切。

我建議你仔細讀一下Brad Wilson的文章,如果你想快一點,這里總結了一下。

.NET 3.5 SP1帶來了System.ComponentModel.DataAnnotations程序集,通過數據的注解和DataAnnotationModelBinder,你可以處理大部分的服務器端驗證問題,只需要簡單地標注你的模型

    
  1. publicclassRecipe
  2. {
  3. [Required( ErrorMessage = "Weneedanameforthisdish." )]
  4. [RegularExpression("^Bacon")]
  5. publicstringName{get;set;}
  6. //...
  7. }

Tip#5綁定和驗證是兩個步驟

綁定是從環境中獲得數據,然后賦予模型對象的過程,驗證是檢查模型對象的數據,確認符合我們的期望。這是完全不同的操作,但是模型綁定模糊了他們的區別。如果你希望在Model Binder中一起完成這兩步工作,是可以的,這需要準確地知道DataAnnotationsModelBinder做了什么,你可以看這幾個例子。實際上,經常被忽略的一點是DefaultModelBinder如何分離綁定和驗證步驟。如果只是簡單屬性的驗證,所有你要做的就是重寫DefaultModelBinder的OnProperValidating方法。

下面的幾篇文章可以參考一下:

Tip#6關于綁定的內容

前面我說過:Model Binder可以幫你從Request和HttpContext中擺脫出來。從更加廣泛的角度來說,并沒有限制數據的來源,請求上下文中包含豐富的客戶端信息。Scott Hanselman的另外一篇文章演示了將用戶的標識綁定到模型上。

綜上所述

Model Binding是美妙的魔術,所以,盡可能使用內置的奇妙功能

ASP.NET MVC模型綁定的6個建議


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品99久久 | 久草免费新视频 | 99精品欧美一区二区三区综合在线 | 日韩视频一区二区三区 | 亚洲视频在线一区二区 | 亚洲国产成人精品女人 | 国产在线中文字幕 | 91精品久久久久久久久网影视 | 一级特黄女人生活片 | 国产99久久精品一区二区永久免费 | 午夜小电影 | 久久草在线 | 欧美乱视频 | 午夜小网站 | 国产精品毛片无码 | 国内精品伊人久久久久7777人 | 日本黄a三级三级三级 | 色噜噜色噜噜天天拍一拍 | 亚洲精品自拍 | www.久久久.com | 精品在线不卡 | 欧美久草在线 | 久草中文字 | 日本精品久久久一区二区三区 | 亚洲精品国产成人一区二区 | 欧美精品区| 九九re6精品视频在线观看 | 精品成人一区 | 奇米影音第四色 | 黄色国产视频 | 日韩毛片欧美一级a网站 | www.riben| 欧美久久视频 | 奇米色777欧美一区二区 | www.91成人 | 波多野结衣中文在线播放 | 欧美精品亚洲一区二区在线播放 | 国产亚洲精品久久久久久线投注 | 日本一在线中文字幕天堂 | 米奇影院7777 | 九九热国产在线 |