出於某種原因,當我這個JSON發送到一個動作:默認ASP.NET MVC 3模型綁定不綁定小數性質
{"BaseLoanAmount": 5000}
這是應該被綁定到一個模型小數屬性名爲「BaseLoanAmount」,它不綁定,它只是停留0。但是,如果我派:
{"BaseLoanAmount": 5000.00}
它不綁定屬性,但爲什麼呢?如果不具有十進制數字,5000不能轉換爲十進制事件嗎?
出於某種原因,當我這個JSON發送到一個動作:默認ASP.NET MVC 3模型綁定不綁定小數性質
{"BaseLoanAmount": 5000}
這是應該被綁定到一個模型小數屬性名爲「BaseLoanAmount」,它不綁定,它只是停留0。但是,如果我派:
{"BaseLoanAmount": 5000.00}
它不綁定屬性,但爲什麼呢?如果不具有十進制數字,5000不能轉換爲十進制事件嗎?
步入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());
嘗試發送這樣的:
{ "BaseLoanAmount": "5000" }
我使用JSON.stringify來準備JSON,是否有服務器端解決方案?我不想因爲ASP.NET MVC誰沒有做好自己的工作而弄亂客戶端代碼。 – ryudice 2011-04-18 05:55:53
@ryudice,恐怕這就是javascript串行器如何處理數字格式。當你開始使用可爲空的小數,浮點數時,事物可能會變得更加混亂......你會發現許多差異。無論如何根據JSON規範報價總是應該使用,所以我不太確定誰不正確地做他的工作。因此,您可能需要將數字值轉換爲字符串,然後在客戶端對其進行字符串化。 – 2011-04-18 05:57:39
我剛剛發現,如果我將屬性類型更改爲double,它會綁定好,您知道問題是否可以在值提供程序或模型聯編程序中?你知道是否有一個價值提供者使用JSON.net而不是框架JavaScript解串器? – ryudice 2011-04-18 06:03:20
'返回'中的布爾表達式語句'valueProviderResult == null'不能計算爲true,因爲之前的'valueProviderResult.AttemptedValue'會拋出一個null-ref異常。 – Diego 2012-03-28 20:53:21
注意:菲爾哈克也建議這樣做,http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx – 2012-08-03 15:24:50
我一直在使用您的原始解決方案來處理這個問題 - 謝謝!一個問題:註定爲十進制的空值?字段分配爲零。我終於通過檢查'valueProviderResult.RawValue == null'來確定是否分配類型的默認值。 – Matt 2012-10-22 22:04:36