精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MVC3不能正確識別JSON中的Enum枚舉值

開發(fā) 后端
在MVC3項(xiàng)目里,如果Action的參數(shù)中有Enum枚舉作為對象屬性的話,使用POST方法提交過來的JSON數(shù)據(jù)中的枚舉值卻無法正確被識別對應(yīng)的枚舉值。

一、背景

在MVC3項(xiàng)目里,如果Action的參數(shù)中有Enum枚舉作為對象屬性的話,使用POST方法提交過來的JSON數(shù)據(jù)中的枚舉值卻無法正確被識別對應(yīng)的枚舉值。

二、Demo演示

為了說明問題,我使用MVC3項(xiàng)目創(chuàng)建Controller,并且創(chuàng)建如下代碼演示:

  1. //交通方式枚舉  
  2.     public enum TrafficEnum  
  3.     {  
  4.         Bus = 0,  
  5.         Boat = 1,  
  6.         Bike = 2,  
  7.     }  
  8.     public class Person  
  9.     {  
  10.         public int ID { get; set; }  
  11.         public TrafficEnum Traffic { get; set; }  
  12.     }  
  13.  
  14.     public class DemoController : Controller  
  15.     {  
  16.         public ActionResult Index(Person p)  
  17.         {  
  18.             return View();  
  19.         }  
  20.     } 

網(wǎng)站生成成功之后,就可以使用Fiddler來發(fā)送HTTP POST請求了,注意需要的是,要在Request Headers加上請求頭content-type:application/json,這樣才能通知服務(wù)器端Request Body里的內(nèi)容為JSON格式。

      點(diǎn)擊右上角的Execute執(zhí)行HTTP請求,在程序斷點(diǎn)情況下,查看參數(shù)p,屬性ID已經(jīng)正確的被識別到了值為9999,而枚舉值屬性Traffic卻被錯(cuò)認(rèn)為枚舉中的首個(gè)值Bus,這儼然是錯(cuò)誤的,縱使你將Traffic修改成Bike,也就是值等于2,結(jié)果也是一樣。

三、解決方法

方法一:

升級MVC4,親測在MVC4項(xiàng)目下,這個(gè)問題已經(jīng)被修復(fù)了;

方法二:

假若因?yàn)楦鞣N原因,項(xiàng)目不想或者不能升級為MVC4,可以在MVC3項(xiàng)目上做些改動,亦可修復(fù)這個(gè)問題,

1、在項(xiàng)目中,新建一個(gè)類,加入以下代碼,需要引用一下 using System.ComponentModel;  using System.Web.Mvc; 命名空間;

  1. /// <summary>  
  2.     /// 處理在MVC3下,提交的JSON枚舉值在Controller不能識別的問題  
  3.     /// </summary>  
  4.     public class EnumConverterModelBinder : DefaultModelBinder  
  5.     {  
  6.         protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)  
  7.         {  
  8.             var propertyType = propertyDescriptor.PropertyType;  
  9.             if (propertyType.IsEnum)  
  10.             {  
  11.                 var providerValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);  
  12.                 if (null != providerValue)  
  13.                 {  
  14.                     var value = providerValue.RawValue;  
  15.                     if (null != value)  
  16.                     {  
  17.                         var valueType = value.GetType();  
  18.                         if (!valueType.IsEnum)  
  19.                         {  
  20.                             return Enum.ToObject(propertyType, value);  
  21.                         }  
  22.                     }  
  23.                 }  
  24.             }  
  25.             return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);  
  26.         }  
  27.     } 

2、在Global.asax的Application_Start方法中,進(jìn)行EnumConverterModelBinder類的實(shí)例化操作:

  1. protected void Application_Start()  
  2.  {  
  3.      //處理在MVC3下,提交的JSON枚舉值在Controller不能識別的問題  
  4.      ModelBinders.Binders.DefaultBinder = new EnumConverterModelBinder();  
  5.  } 

進(jìn)行配置改造之后,我再次生成網(wǎng)站,重新發(fā)送HTTP請求看,MVC Action中的參數(shù)里的枚舉就能被正確的識別到了。

#p#

四、研究

我覺得這應(yīng)該是mvc3里面一個(gè)小小的缺陷吧,隨著mvc的升級,這已經(jīng)在新版本里被完善修復(fù)了,可還用著mvc3的人如果在項(xiàng)目中遇到這個(gè)問題,可以研究一下。

遇到一個(gè)問題,去百度谷歌找解決方案是可以,但是復(fù)制粘貼完代碼之后,最好問下自己,為什么這樣可以解決問題。

從現(xiàn)象和解決代碼中猜想,應(yīng)該是在MVC生命周期中的Model Binders 這一環(huán)節(jié)出了問題。

因?yàn)镸VC已經(jīng)開源了,所以我嘗試著調(diào)試源碼,首先下載MVC3的源碼,其他項(xiàng)目可以移除,只保留紅色框中的項(xiàng)目即可,然后新建一個(gè)MVC3測試項(xiàng)目,并且將此測試項(xiàng)目的system.web.mvc引用移除,轉(zhuǎn)而引用本解決方案中的system.web.mvc 項(xiàng)目,這樣子,我們才可以對MVC源碼進(jìn)行調(diào)試操作。

搜回來的代碼中可知,我們自定義的類繼承DefaultModelBinder父類,并且重寫了GetPropertyValue方法,那我們就從這點(diǎn)開始,在MVC3源碼中的System.Web.MVC項(xiàng)目中找到該類,在此方法上插入斷點(diǎn)。

F5調(diào)試程序,發(fā)送一個(gè)POST請求。

其實(shí)BindProperty方法是會被多次執(zhí)行的,BindProperties方法會對請求的實(shí)體類的屬性進(jìn)行遍歷,每一個(gè)屬性都要經(jīng)過BindProperty方法的處理;

現(xiàn)在已經(jīng)截獲到第一個(gè)屬性ID了。

緊接著,程序進(jìn)入propertyBinder.BindModel 方法。

只貼部分關(guān)鍵代碼了,通過bindingContextValueProvider 獲得屬性的相關(guān)信息,如果不等于null的話,轉(zhuǎn)到執(zhí)行BindSimpleModel 方法。

#p#

BindSimpleModel方法里,首先通過Type.IsInstanceOfType方法判斷確定指定的對象是否是當(dāng)前 Type 的實(shí)例,如果是,則直接返回rawValue,這里的屬性類型是Int32類型,返回True符合條件,所以直接把rawValue給返回去了。

第一個(gè)Int32類型屬性的部分關(guān)鍵代碼執(zhí)行到這里就已經(jīng)確認(rèn)到值了,接下來,我們看出了問題的Enum枚舉類型屬性。

 循環(huán)來到了第二個(gè)屬性了,這時(shí)我留意到有個(gè)Model屬性,對比Int32類型執(zhí)行的時(shí)候,這個(gè)屬性當(dāng)時(shí)為0,而此時(shí)則為Bus,可見這是一個(gè)默認(rèn)值,指定枚舉中值為0的那個(gè)類型(即使你不為枚舉顯式指定值),同樣的,經(jīng)過BindModel方法來到了BindSimpleModel方法。

此時(shí),對比Int32類型的屬性ID,這次ModelType.IsInstanceOfType(valueProvideResult.RawValue)False,并且接下來不是string類型就執(zhí)行以下的判斷,也不是數(shù)組類型,所以,來到了最后一個(gè),根據(jù)綠色的注釋可以看出,這應(yīng)該是一個(gè)判斷是否collection集合類型的方法,Enum都不是,所以,返回了Null

這時(shí),Type collectionType變量為Null,執(zhí)行最后一個(gè)case 3

ConvertProviderResult方法里,也進(jìn)行了一系列的類型判斷轉(zhuǎn)換,目的就是將JSON中的數(shù)字類型轉(zhuǎn)換成枚舉值,但是執(zhí)行過程中拋出異常了,原因是

No type converter can convert between these types ” 也就是說,在MVC3的機(jī)制中,并沒有相應(yīng)的type converter來處理數(shù)值與枚舉的對應(yīng)。

經(jīng)過以上這些處理方法,都沒完成把對應(yīng)的值確認(rèn)下來,怎么給原來的BindProperty 老大方法交差呢,所以,小的只好將Value=Null 和 modelState.Errors 模型錯(cuò)誤狀態(tài)信息如實(shí)帶回去了,讓老大決定怎么做,老大后面處理這里有點(diǎn)繞,但是我看源碼估計(jì)也是拿默認(rèn)值來充當(dāng)Value了,所以就造成了JSON傳過來的值與對應(yīng)枚舉的值不對應(yīng)的情況,無論傳什么值,結(jié)果都是第一個(gè)枚舉的值。

 五、總結(jié)

這篇文章只是我在工作上遇到的一個(gè)小問題,然后有點(diǎn)小興趣就從源碼的角度上來研究和分析,缺乏理論的依據(jù),因?yàn)橹皼]有很深入的去研究MVC的底層運(yùn)行機(jī)制與生命周期,所以這方面還需要得加強(qiáng)學(xué)習(xí)一下,如果你也有興趣,可以下載我修改好的源碼來分析一下,甚至可以下載MVC4的源碼來進(jìn)行對比。

責(zé)任編輯:林師授 來源: 博客園
相關(guān)推薦

2012-07-11 23:32:33

MVC3項(xiàng)目

2012-06-26 09:37:54

Web

2012-06-23 20:24:33

Web

2015-06-23 16:42:21

2012-08-27 10:11:43

ASP.NET

2012-07-16 13:02:01

2022-06-27 10:26:37

枚舉Java

2010-02-03 10:05:48

C++ enum枚舉

2009-04-09 15:40:01

JSONJavaScript枚舉

2012-03-13 09:11:46

Web

2011-04-18 09:35:59

ASP.NET MVC

2021-10-26 15:36:17

C++枚舉值類型

2010-05-26 08:56:42

MySQL服務(wù)不能啟動

2010-12-07 09:38:15

ASP.NET MVC

2010-10-20 09:05:16

ASP.NET MVC

2009-12-04 18:00:46

PHP開發(fā)MVC模型

2009-12-04 14:09:52

PHP JSON應(yīng)用

2011-04-14 09:19:22

ASP.NET MVC

2010-10-14 09:05:36

ASP.NET MVC

2010-03-02 14:12:30

WCF枚舉類型
點(diǎn)贊
收藏

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

日韩在线观看免费全| 色8久久人人97超碰香蕉987| 亚洲xxx大片| 久久露脸国语精品国产91| 一道在线中文一区二区三区| 欧美日韩激情一区二区三区| 无码av天堂一区二区三区| 韩国三级在线观看久| 国内精品免费**视频| 午夜精品一区二区三区在线视频| 国产精品无码一区二区三区| 国产精品日本一区二区不卡视频| 午夜欧美在线一二页| 色综合视频二区偷拍在线| 性生交生活影碟片| 肉丝袜脚交视频一区二区| 美女久久久久久久久久久| 亚洲男人在线天堂| www.欧美| 欧美午夜电影在线播放| 亚洲精品蜜桃久久久久久| av天在线观看| 久久精品一区八戒影视| 波多野结衣精品久久| 一级全黄裸体免费视频| 亚洲欧美卡通另类91av| 欧美激情精品久久久久久蜜臀| 久久久久久成人网| 亚洲理论电影片| 亚洲成人教育av| wwwww在线观看| 亚洲日本免费电影| 欧美日韩黄视频| 免费黄色特级片| 2021中文字幕在线| 亚洲精品大片www| 一区二区三区视频| 成黄免费在线| 中文字幕乱码日本亚洲一区二区| 欧美视频1区| 人妻妺妺窝人体色www聚色窝| 国产成人亚洲综合a∨婷婷| 国产日韩中文在线| 亚洲视频一区二区三区四区| 日韩—二三区免费观看av| 91黑丝在线观看| 国产成人无码精品久久久久| 一区视频在线看| 欧美日韩国产二区| 久久久美女视频| 欧美激情五月| 欧美激情亚洲激情| 国产在线视频在线观看| 欧美1区2区3区| 欧美大片在线影院| 国产亚洲欧美精品久久久www| 欧洲熟妇的性久久久久久| 污视频在线看网站| 亚洲综合在线免费观看| 国产手机免费视频| 91豆花视频在线播放| 婷婷久久综合九色综合绿巨人 | 欧美一区二区三区免费观看 | a视频在线播放| 一区二区三区小说| 三上悠亚久久精品| 二区三区不卡| 欧美撒尿777hd撒尿| 999这里有精品| 日本一区二区乱| 亚洲第一区中文99精品| 国产精品无码一区二区三区免费| 丝袜美腿综合| 少妇高潮 亚洲精品| 日本aⅴ在线观看| 在线观看的日韩av| 国产91色在线免费| 国产精品一区二区av白丝下载 | 国产又黄又粗视频| 97视频精品| 欧美激情在线视频二区| 国产精品777777| 精品在线一区二区三区| 国产精品12| 久久手机免费观看| 亚洲人成电影网站色mp4| av免费观看国产| 精品欧美日韩精品| 日韩免费观看高清完整版| 可以直接看的无码av| 欧美r级电影| 7777免费精品视频| 国产尤物视频在线观看| 不卡一区二区在线| 亚洲欧洲一区二区| 大香伊人久久| 欧美日韩欧美一区二区| 亚洲精品乱码久久久久久蜜桃图片| 欧美美女在线观看| 懂色一区二区三区免费观看| 久久久久一本一区二区青青蜜月 | 狠狠干成人综合网| 国产成人亚洲综合91| 国产色视频在线| 久久久不卡网国产精品二区| 好吊色视频988gao在线观看| 亚洲人成午夜免电影费观看| 欧美一区二区黄| 亚洲国产日韩一区无码精品久久久| 欧美黄色精品| 国产噜噜噜噜噜久久久久久久久| 日韩一卡二卡在线| 亚洲天堂网中文字| 亚洲黄色a v| 精品日产乱码久久久久久仙踪林| 久久久国产精品视频| 成人h动漫精品一区二区下载| 成人综合在线视频| 五月天色婷婷综合| 欧洲成人一区| 亚洲欧美精品suv| 日韩黄色三级视频| 国产成人自拍高清视频在线免费播放| 日本视频一区在线观看| 天堂中文在线播放| 精品国产乱码久久久久久浪潮| 99热在线观看精品| 日韩av一二三| 日本精品一区二区三区视频| 九九精品调教| 日韩欧美国产三级电影视频| 任我爽在线视频| 日本美女一区二区三区| 日本高清不卡三区| 欧美日韩视频网站| 国产成人精品亚洲精品色欲| 国产精品1024| 中文字幕欧美日韩一区二区三区| 亚洲精品一级二级| 精品va天堂亚洲国产| 91嫩草|国产丨精品入口| 日韩激情一二三区| 欧美自拍资源在线| 在线日本欧美| 一个人www欧美| www毛片com| 久久影院午夜论| 无码人妻h动漫| 日韩欧美ww| 欧美一级淫片videoshd| 巨胸大乳www视频免费观看| 国产精品永久久久久久久久久| 丰满亚洲少妇av| 免费在线黄网站| 亚洲乱码一区| 国内精品模特av私拍在线观看| 性一交一乱一精一晶| 亚洲成人av中文| 粉嫩av懂色av蜜臀av分享| 亚洲综合精品| 婷婷精品国产一区二区三区日韩| 成人全视频免费观看在线看| 日韩视频在线免费| 国产人妻精品一区二区三| 亚洲激情自拍偷拍| 色天使在线视频| 日韩专区在线视频| 在线天堂一区av电影| baoyu135国产精品免费| 91精品国产精品| 国产污视频在线| 欧美老女人第四色| 国产一卡二卡在线播放| 久久精品视频在线免费观看| 不卡的av中文字幕| 欧美午夜一区| 秋霞毛片久久久久久久久| 亚洲男人在线| 97在线观看免费| yw在线观看| 精品日韩在线观看| 香蕉影院在线观看| 综合激情成人伊人| 国产伦精品一区二区三区精品| 视频一区欧美日韩| 久久观看最新视频| 伊人久久大香线蕉无限次| 国产精品视频自在线| 国产丝袜在线观看视频| 国产亚洲精品一区二555| 国产成人精品毛片| 色一情一乱一乱一91av| 欧美日韩在线国产| 欧美国产一区二区在线观看| 国产吃瓜黑料一区二区| 日韩av在线发布| 国产一区二区四区| 色综合天天综合网中文字幕| 国产乱码精品一区二区三区不卡| 欧美日韩尤物久久| 91精品国产乱码久久久久久蜜臀| 好吊日视频在线观看| 亚洲精品一区中文字幕乱码| 午夜美女福利视频| 欧美日韩情趣电影| 欧美一级片免费在线观看| 国产精品久久福利| 欧美日韩国产综合一区二区| 人人妻人人澡人人爽| 国产91精品久久久久久久网曝门| 人妻内射一区二区在线视频| 国产精品草草| 一区二区成人国产精品| 欧美激情在线免费| 精品日本一区二区三区| 视频精品一区| 国产在线视频2019最新视频| 怡红院成人在线| 6080yy精品一区二区三区| av官网在线播放| 日韩在线欧美在线国产在线| 黄色小视频在线免费观看| 欧美tk—视频vk| 国产青青草视频| 在线电影院国产精品| 日本欧美www| 色呦呦网站一区| 精品成人免费视频| 亚洲aⅴ怡春院| 久草网视频在线观看| 亚洲精品视频免费观看| 小早川怜子一区二区的演员表| 国产日产欧美精品一区二区三区| 丰满大乳奶做爰ⅹxx视频| 成人黄色av网站在线| 日本一区二区免费视频| 国产精品一二三区在线| 交换做爰国语对白| 国产乱人伦偷精品视频不卡| 特黄视频免费观看| 久久国产麻豆精品| 91欧美视频在线| 热久久久久久久| 孩娇小videos精品| 久久99精品国产.久久久久| 拔插拔插华人永久免费| 久久激情综合网| 国产探花在线观看视频| 国产黑丝在线一区二区三区| 在线观看网站黄| 丰满放荡岳乱妇91ww| 一级黄色电影片| 暴力调教一区二区三区| 欧美肉大捧一进一出免费视频| 成人av综合一区| 精品人妻一区二区三区日产乱码卜 | 久久久久观看| 日本欧美爱爱爱| 亚洲成av在线| 成人性生交大片免费观看嘿嘿视频| 亚洲国产一区二区久久| 亚洲最大福利视频网站| 中文字幕亚洲在线观看| 国外成人免费视频| 九九精品在线| 一级做a爰片久久| 欧美~级网站不卡| 欧美男女爱爱视频| 噜噜噜躁狠狠躁狠狠精品视频| 能看的毛片网站| 久久成人综合网| 久草视频福利在线| 久久久久88色偷偷免费| 天天操天天舔天天射| 亚洲男人的天堂av| 日韩av在线电影| 欧洲国内综合视频| 97在线播放免费观看| 精品久久久久久久久久久久久久久久久 | 日本系列欧美系列| 交换做爰国语对白| 91毛片在线观看| 91精品少妇一区二区三区蜜桃臀| 亚洲综合精品久久| 成人免费一级片| 91精品久久久久久久久99蜜臂| 欧美 日韩 国产 成人 在线 91 | 国产av自拍一区| 亚洲免费观看高清完整版在线| 91精品国产乱码久久久张津瑜 | 欧美在线精品免播放器视频| 国产美女久久| 国产乱码精品一区二区三区日韩精品| 狠狠做深爱婷婷综合一区| 日本丰满大乳奶| 日日夜夜精品免费视频| 最新日本中文字幕| 欧美国产日韩亚洲一区| 久久中文字幕无码| 欧美日韩国产精品成人| 天天色综合久久| 欧美另类99xxxxx| 欧亚一区二区| 91视频免费看| 自拍偷拍视频亚洲| 亚洲国产aⅴ天堂久久| 中文字幕日本视频| 亚洲二区在线播放视频| 黄色av电影在线播放| 国产精品1区2区在线观看| xxxx日韩| 日韩精品一区二区三区电影| 奇米影视一区二区三区| 中文字幕av观看| 亚洲永久免费av| 91成品人影院| 在线成人激情视频| 亚洲欧美一区二区三区| 国产亚洲精品自在久久| 中文字幕一区二区精品区| 黄色永久免费网站| 久久久精品影视| 成人在线免费看视频| 欧美成人精品3d动漫h| 久久黄色美女电影| 国产女人18毛片水18精品| 综合伊思人在钱三区| 大陆av在线播放| 成人一区在线看| 青青草偷拍视频| 欧美一区二区三区的| 欧美三级黄网| 国产精品丝袜高跟| 成人午夜av| 91福利国产成人精品播放| 国产香蕉久久精品综合网| 五月天婷婷激情| 日韩精品亚洲精品| 色吧亚洲日本| 欧美午夜欧美| 日产国产高清一区二区三区 | 亚洲啪啪综合av一区二区三区| 亚洲视频久久久| www.久久久久| 自拍偷拍亚洲图片| 欧美中文在线观看| 亚洲精品国产欧美在线观看| 欧美大片国产精品| 黑人极品ⅴideos精品欧美棵| 99一区二区三区| 在线国产日韩| 中文字幕在线免费看线人| 欧美色视频日本高清在线观看| 人成在线免费视频| 国产精品电影在线观看| 成人国产精品一级毛片视频| 91制片厂毛片| 亚洲人成7777| 少妇av一区二区| 国产精品99久久久久久人| 色欧美自拍视频| 91亚洲一区二区| 亚洲国产一区二区视频| 瑟瑟在线观看| 国产精品日韩精品| 亚洲精品成人无限看| 欧美xxxx日本和非洲| 粉嫩老牛aⅴ一区二区三区| 九色视频网站在线观看| 国产日韩欧美中文| 欧美午夜精品| 91成年人网站| 欧美另类久久久品| sm久久捆绑调教精品一区| 日本福利一区二区三区| 韩国一区二区在线观看| 黄色小说在线观看视频| 精品无人区乱码1区2区3区在线| 亚洲日本在线观看视频| 欧美做受777cos| 97久久精品人人做人人爽| 中文字幕一区二区三区四区视频| 精品综合久久久久久97| 婷婷精品在线观看| 天天干天天色天天干| 亚洲午夜视频在线观看| 电影在线高清| 国产精品我不卡| 免费在线看一区| 99在线观看| 国产亚洲电影| av地址在线观看| 日本黄色一区二区| 天堂8中文在线| 青青草原成人| 波多野结衣一区二区三区| 伊人成人在线观看| 国产做受69高潮| 91精品国产自产在线观看永久∴| 国产精品久久久免费观看|