2011-04-18 174 views
46

出於某種原因,當我這個JSON發送到一個動作:默認ASP.NET MVC 3模型綁定不綁定小數性質

{"BaseLoanAmount": 5000} 

這是應該被綁定到一個模型小數屬性名爲「BaseLoanAmount」,它不綁定,它只是停留0。但是,如果我派:

{"BaseLoanAmount": 5000.00} 

它不綁定屬性,但爲什麼呢?如果不具有十進制數字,5000不能轉換爲十進制事件嗎?

回答

71

步入asp.net的MVC的源代碼後,seemsd的問題是,對於轉換asp.net MVC使用框架的類型轉換器,由於某種原因返回一個int十進制轉換錯誤,我結束了使用小數自定義模型粘合劑供應商和模型綁定,你可以在這裏看到:

public class DecimalModelBinder : DefaultModelBinder 
{ 
    #region Implementation of IModelBinder 

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 

     if (valueProviderResult.AttemptedValue.Equals("N.aN") || 
      valueProviderResult.AttemptedValue.Equals("NaN") || 
      valueProviderResult.AttemptedValue.Equals("Infini.ty") || 
      valueProviderResult.AttemptedValue.Equals("Infinity") || 
      string.IsNullOrEmpty(valueProviderResult.AttemptedValue)) 
      return 0m; 

     return Convert.ToDecimal(valueProviderResult.AttemptedValue); 
    }  

    #endregion 
} 

註冊這個模型綁定器,只要把下面的行內Application_Start()

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder()); 
ModelBinders.Binders.Add(typeof(decimal?), new DecimalModelBinder()); 
+4

'返回'中的布爾表達式語句'valueProviderResult == null'不能計算爲true,因爲之前的'valueProviderResult.AttemptedValue'會拋出一個null-ref異常。 – Diego 2012-03-28 20:53:21

+2

注意:菲爾哈克也建議這樣做,http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx – 2012-08-03 15:24:50

+2

我一直在使用您的原始解決方案來處理這個問題 - 謝謝!一個問題:註定爲十進制的空值?字段分配爲零。我終於通過檢查'valueProviderResult.RawValue == null'來確定是否分配類型的默認值。 – Matt 2012-10-22 22:04:36

12

嘗試發送這樣的:

{ "BaseLoanAmount": "5000" } 
+2

我使用JSON.stringify來準備JSON,是否有服務器端解決方案?我不想因爲ASP.NET MVC誰沒有做好自己的工作而弄亂客戶端代碼。 – ryudice 2011-04-18 05:55:53

+2

@ryudice,恐怕這就是javascript串行器如何處理數字格式。當你開始使用可爲空的小數,浮點數時,事物可能會變得更加混亂......你會發現許多差異。無論如何根據JSON規範報價總是應該使用,所以我不太確定誰不正確地做他的工作。因此,您可能需要將數字值轉換爲字符串,然後在客戶端對其進行字符串化。 – 2011-04-18 05:57:39

+0

我剛剛發現,如果我將屬性類型更改爲double,它會綁定好,您知道問題是否可以在值提供程序或模型聯編程序中?你知道是否有一個價值提供者使用JSON.net而不是框架JavaScript解串器? – ryudice 2011-04-18 06:03:20