程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> MVC3不能正確識別JSON中的Enum枚舉值(1)

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

編輯:C++入門知識

一、背景

在MVC3項目裡,如果Action的參數中有Enum枚舉作為對象屬性的話,使用POST方法提交過來的JSON數據中的枚舉值卻無法正確被識別對應的枚舉值。

二、Demo演示

為了說明問題,我使用MVC3項目創建Controller,並且創建如下代碼演示:

  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.     } 

網站生成成功之後,就可以使用Fiddler來發送HTTP POST請求了,注意需要的是,要在Request Headers加上請求頭content-type:application/json,這樣才能通知服務器端Request Body裡的內容為JSON格式。

    點擊右上角的Execute執行HTTP請求,在程序斷點情況下,查看參數p,屬性ID已經正確的被識別到了值為9999,而枚舉值屬性Traffic卻被錯認為枚舉中的首個值Bus,這俨然是錯誤的,縱使你將Traffic修改成Bike,也就是值等於2,結果也是一樣。

三、解決方法

方法一:

升級MVC4,親測在MVC4項目下,這個問題已經被修復了;

方法二:

假若因為各種原因,項目不想或者不能升級為MVC4,可以在MVC3項目上做些改動,亦可修復這個問題,

1、在項目中,新建一個類,加入以下代碼,需要引用一下 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方法中,進行EnumConverterModelBinder類的實例化操作:

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

進行配置改造之後,我再次生成網站,重新發送HTTP請求看,MVC Action中的參數裡的枚舉就能被正確的識別到了。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved