2013-01-20 48 views
5

當我的表單發佈到我的控制器操作並且表單綁定到我的模型時,可爲空的雙精度值和小數點的空白表格值默認爲0,但可爲null的空表格值默認爲null。這是正確的嗎?模型綁定 - 可爲空的十進制和雙精度值爲0而不是null?

我的模型對於可以爲空的幾個字段具有可以爲空的類型。它有可爲空的整數,雙精度和小數。然後我有一個常規窗體,每個屬性都有文本框,並且它們都默認爲空白(空字符串)。當這個表單被髮回到我的控制器操作並且所有空表單值,並且它綁定到我的模型時,空的雙精度和小數點顯示爲0,空整數爲空。

在我看來,所有可以爲空的類型都應該在空表單值傳入時默認爲null,但即使情況並非如此,似乎非常不穩定,雙精度和小數被視爲與int不同。

+0

剛上關的機會:當實例模型,前綁定到它,當時你的可空雙精度值和小數值有什麼值? –

+0

這將是有益的,如果你可以發佈代碼。 – 2014-04-30 04:04:10

回答

4

此問題在MVC4中似乎已解決,因爲我無法重現該問題。我的空文本框全部綁定到null到我的模型的可空,int,double或decimal。沒有問題。所以這個問題可能在別的地方,或者這可能是MVC3中的一個bug,而且現在已經不存在了。這就是說,如果你仍然遇到問題,不能使用MVC4,請嘗試製作你自己的自定義模型綁定器來完成你需要做的事情。下面是十進制的例子之一:

public class NullableDecimalBinder : IModelBinder { 

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { 
     ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     ModelState modelState = new ModelState { Value = valueResult }; 
     object result = null; 

     if (valueResult.AttemptedValue.Length > 0) { 
      try { 
       // Bonus points: This will bind using the user's current culture. 
       result = Convert.ToDecimal(valueResult.AttemptedValue, System.Globalization.CultureInfo.CurrentCulture); 
      } catch (FormatException e) { 
       modelState.Errors.Add(e); 
      } catch (InvalidOperationException e) { 
       modelState.Errors.Add(e); 
      } 
     } 

     bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
     return result; 
    } 
} 

然後,要使用它,這條線添加到您的Global.asax的Application_Start

ModelBinders.Binders.Add(typeof(decimal?), new NullableDecimalBinder()); 
相關問題