Después de entrar en el código fuente de asp.net mvc, que seemsd el problema es que para el asp.net mvc conversión utiliza convertidor de tipos del marco, que por alguna razón devuelve false para un int a la conversión decimal, que terminé usando un proveedor de ligante modelo personalizado y un aglutinante modelo para los decimales, se puede ver aquí:
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
}
para registrar este ModelBinder, sólo hay que poner la siguiente línea en el interior Application_Start()
:
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
ModelBinders.Binders.Add(typeof(decimal?), new DecimalModelBinder());
Expresión booleana en 'return' La declaración 'valueProviderResult == null' no se puede evaluar como verdadera, ya que' valueProviderResult.AttemptedValue' antes de eso generaría una excepción de null-ref. – Diego
nota: Phil Haack también recomienda esto, http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx –
He estado utilizando su solución original para resolver exactamente este problema, ¡gracias! Un problema: ¿nulos destinados a decimal? los campos se asignan cero en su lugar. Finalmente opté por verificar 'valueProviderResult.RawValue == null' para determinar si asignar el valor predeterminado del tipo. – Matt