成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

當(dāng)ASP.NET MVC邂逅jQuery.Ajax提交數(shù)組

開發(fā) 后端
硬編碼味道太重,換個(gè)類型又得重寫,工作量跟之前比還視乎增加了,只是Controller變得優(yōu)雅了。這種浪費(fèi)青春又耗電的做法還是不符合要求。

當(dāng)ASP.NET MVC 通過(guò)JQuery的Ajax 提交數(shù)組時(shí),MVC的model binder機(jī)制就失效了。我們不得不在Controller里面編寫自定義代碼,將Request提交的數(shù)據(jù)轉(zhuǎn)換成需要的數(shù)據(jù)類型。這個(gè)過(guò)程往往枯燥乏味。下面以某項(xiàng)目的實(shí)際例子來(lái)演示如何解決這個(gè)問(wèn)題,提供一個(gè)通用的解決方案。 

需求描述

當(dāng)用戶更改了配置,需要Ajax提交到服務(wù)器。

前端代碼:

  1. var items = [];  
  2. $("input:checked").each(function () {  
  3.     items.push($(this).val());  
  4. });  
  5. $.ajax({  
  6.     type: 'post',  
  7.     url: 'Configure/Status',  
  8.     data: { answers: items }  
  9. }); 

后端代碼:

  1. public enum AnswerStatus  
  2. {  
  3.         Correct = 1,  
  4.         Incorrect = 2,  
  5.         Unanswered = 3 
  6. }  
  7. [HttpPost]  
  8. public ActionResult Status(IList<AnswerStatus> answers)  
  9. {  
  10.      ….  

這里的answers始終為null. 神器fiddler出場(chǎng),發(fā)現(xiàn)用JQuery.Ajax 提交Array的數(shù)據(jù),提交的時(shí)候始終會(huì)在名稱后面加上”[]”, 問(wèn)題就出在這里。

根據(jù)發(fā)現(xiàn)的結(jié)果修改代碼:

  1. [HttpPost]  
  2. public ActionResult Status(IList<AnswerStatus> answers)  
  3. {  
  4.     answers = Request.Form.GetValues(“answers[]”).Select(d => d.ToEnum<AnswerStatus>(AnswerStatus.Unanswered).ToList();  

雖然這樣能夠通過(guò)解決我的問(wèn)題,但每次提交Array都要這樣手工解析request,視乎一夜回到石器時(shí)代了。其實(shí)我們馬上會(huì)想到MVC 的Mode Binder。

嘗試進(jìn)行***次重構(gòu):

  1. public class AnswerModelBinder : IModelBinder  
  2. {  
  3.     public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)  
  4.     {  
  5.         return controllerContext.RequestContext.HttpContext.Request.Form.GetValues(“answers[]”).Select(d => d.ToEnum<AnswerStatus>(AnswerStatus.Unanswered).ToList();      
  6.     }  

硬編碼味道太重,換個(gè)類型又得重寫,工作量跟之前比還視乎增加了,只是Controller變得優(yōu)雅了。這種浪費(fèi)青春又耗電的做法還是不符合要求。

進(jìn)行第二次重構(gòu) : DefaultModelBinder 出場(chǎng)

***的DefaultModelBinder,能夠綁定任何類型,可惜就是client傳過(guò)來(lái)的name后面多加了”[]”,導(dǎo)致DefaultModelBinder無(wú)法準(zhǔn)確解析。那我們能不能欺騙DefaultModelBInder呢?

查看ModelBindingContext發(fā)現(xiàn)有一個(gè)ModelName屬性,感覺有點(diǎn)像要綁定的參數(shù)的名稱,調(diào)試跟蹤發(fā)現(xiàn)ModelName確實(shí)就是參數(shù)的名稱,那我們修改ModelName讓他跟client傳過(guò)來(lái)的name保持一致是否就能夠充分發(fā)揮DefaultModelBinder。于是動(dòng)手創(chuàng)建一個(gè)JQAjaxModelBinder

并繼承自DefaultModelBinder:

  1. public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)  
  2. {  
  3.     if(bindingContext.ModelType.IsEnumerable())  
  4.     {  
  5.         var key = bindingContext.ModelName + "[]";  
  6.         var valueResult = bindingContext.ValueProvider.GetValue(key);  
  7.         if(valueResult != null && !string.IsNullOrEmpty(valueResult.AttemptedValue))  
  8.         {  
  9.              bindingContext.ModelName = key;  
  10.          }  
  11.     }  
  12.     return base.BindModel(controllerContext, bindingContext);  
  13. }//如何使用自定義ModelBinder。該方法是Controller里面的Action  
  14. public ActionResult Status([ModelBinder(typeof(ModelBinder.JQAjaxModelBinder))] IList<AnswerStatus> answers)  
  15. {  
  16.     …          
  17. }  

這時(shí),Controller里面的Status (Action)方法已經(jīng)能夠正確得到前端傳來(lái)的數(shù)據(jù)。并且還是強(qiáng)類型的。當(dāng)然很多程序員都是懶惰的,筆者也是這其中一份子。筆者連Parameter前面的參數(shù)([ModelBinder(typeof(ModelBinder.JQAjaxModelBinder))])都不想寫,那我們直接在ModelBinders里面注冊(cè)吧。其實(shí)注冊(cè)的時(shí)候也有點(diǎn)麻煩,必須設(shè)定Type,我那能提前知道有那些類型啊。干脆將JQAjaxModelBinder設(shè)置成默認(rèn)的ModerBinder,一勞永逸,再也沒有煩心事情了。

ModelBinder不同注冊(cè)方法

通過(guò)在Action方法的參數(shù)前面添加ModelBinder標(biāo)簽,上文則是采用的這種方法。

數(shù)據(jù)類型上面添加ModelBinder標(biāo)簽

  1. [ModelBinder(typeof(ModelBinder.JQAjaxModelBinder))]  
  2. Public class User  
  3. {  

通過(guò)ModelBinders注冊(cè)

  1. ModelBinders.Binders.Add(typeof(User), new ModelBinder.JQAjaxModelBinder()); 

設(shè)置默認(rèn)的ModerBinder

  1. ModelBinders.Binders.DefaultBinder = new ModelBinder.JQAjaxModelBinder(); 

后記: 當(dāng)我們?cè)陂_發(fā)的時(shí)候,經(jīng)常做重復(fù)的事情,當(dāng)一件事情重復(fù)多次后,我們就需要停下來(lái)認(rèn)真思考,能不能將這些事情抽象出來(lái),做一個(gè)通用的解決方案呢?一勞永逸的解決這些問(wèn)題。

原文鏈接:http://www.cnblogs.com/coolite/archive/2012/12/24/JQModelBinder.html

【編輯推薦】

  1. .Net 垃圾回收和大對(duì)象處理
  2. 不改代碼就能優(yōu)化ASP.NET網(wǎng)站性能的方法
  3. 檢測(cè)常見ASP.NET配置安全漏洞
  4. ASP.NET Web開發(fā)框架項(xiàng)目介紹
  5. 各自為政:ASP.NET實(shí)現(xiàn)團(tuán)隊(duì)分工的思考
責(zé)任編輯:張偉 來(lái)源: 博客園
相關(guān)推薦

2009-07-29 16:40:50

Ajax提交asp.n

2009-07-29 09:17:12

jQuery刪除

2009-07-22 16:11:43

ASP.NET AJA

2009-07-22 16:17:39

ASP.NET AJA

2009-07-22 16:25:41

ASP.NET AJA

2009-07-24 13:41:15

ASP.NET AJA

2009-07-24 13:20:44

MVC框架ASP.NET

2009-07-22 16:05:34

ASP.NET AJA

2009-08-18 17:50:37

ASP.NET MVC

2009-07-31 12:43:59

ASP.NET MVC

2011-08-24 09:43:06

ASP.NET MVC

2009-07-22 15:58:52

ASP.NET AJA

2009-07-31 13:24:43

ASP.NET AJA

2009-07-29 13:50:26

UpdatePanelASP.NET

2009-07-20 10:16:13

配置ASP.NET A

2009-07-28 09:02:32

asp.net aja

2009-07-20 10:53:59

ASP.NET MVC

2009-07-22 10:09:59

ASP.NET MVC

2009-07-23 14:31:20

ASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日本久久www成人免 成人久久久久 | 精国产品一区二区三区四季综 | 精品久 | 在线免费观看黄色 | 91综合网| 久久精品国产免费高清 | 国产精品一区二区三区久久久 | 欧美三级免费观看 | 亚洲国产精品一区 | 午夜不卡一区二区 | 日本人爽p大片免费看 | 精久久久| 日韩综合在线 | 狠狠的操 | 欧美一级黄色片在线观看 | 久久999| 一区二区三区免费看 | 精品1区2区3区 | 91麻豆精品国产91久久久久久 | 亚洲国产精品一区 | 欧美精品一区二区三区在线播放 | 欧美xxxx黑人又粗又长 | 欧美日韩精品免费观看 | 日韩成人在线一区 | 秋霞电影一区二区三区 | 欧美日韩成人在线观看 | 国产精品亚洲一区二区三区在线 | 精一区二区 | a级在线 | 日本二区在线观看 | 亚洲综合精品 | 久久久激情视频 | 精品一区二区久久久久久久网站 | 欧美激情精品久久久久久变态 | 99爱在线视频 | 亚洲人成人一区二区在线观看 | 日韩一区在线播放 | 国产精品日日夜夜 | 国产精品无码久久久久 | 国产激情在线看 | 91精品国产综合久久精品 |