2011-05-24 15 views
8

En mi modelo, tengo el siguiente decimal? Propiedad:.NET MVC 3 Custom Decimal? Carpeta modelo

public decimal? Budget { get; set; } 

me doy cuenta de que necesito un ligante modelo personalizado para los decimales, que Haack proporcionado en el siguiente enlace: http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx.

He modificado su código de modo que si el valor que se pasa contiene un símbolo de moneda y/o coma, entonces lo desvío y luego trato de convertirlo a un decimal. Esto funciona, pero dado que mi propiedad es un tipo decimal numerable, también quiero que no acepte nada y siga su camino feliz insertando un nulo en esa columna en mi base de datos. Ahora mismo inserta un 0.00. Sé que me estoy perdiendo algo en mi código, pero estoy teniendo una congelación cerebral.

Aquí está el código de aglutinante:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
    ModelState modelState = new ModelState { Value = valueResult }; 
    object actualValue = null; 
    object newValue = null; 
    try 
    { 
     if (!string.IsNullOrEmpty(valueResult.AttemptedValue)) 
     { 
      newValue = valueResult.AttemptedValue.Replace("$", "").Replace(",", ""); 
     } 

     actualValue = Convert.ToDecimal(newValue, CultureInfo.CurrentCulture); 
    } 
    catch (FormatException e) 
    { 
     modelState.Errors.Add(e); 
    } 

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

Una vez más, el objetivo es tener decimal? actúa como lo hace normalmente, pero si hay un valor que contiene un símbolo de moneda y/o una coma y se puede convertir a un decimal para luego devolverlo.

Gracias

Respuesta

1

En el bloque try, creo que necesita algo así como

string valToCheck = valueResult.AttemptedValue; 
if(valToCheck == string.Empty) 
{ 
    actualValue = null; 
} 
else 
{ 
    actualValue = Convert.ToDecimal(valToCheck.Replace("$", string.Empty), CultureInfo.InvariantCulture); 
} 

En su código, siempre se está configurando actualValue al resultado de ToDecimal().

8

Probablemente sea mejor que utilice el soporte integrado para el manejo de NumberStyles. Al hacer esto, puede representar algo más que el simple signo de dólar, pero también puede manejar libras, yenes, etc. ...

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    ValueProviderResult valueResult = bindingContext.ValueProvider 
     .GetValue(bindingContext.ModelName); 
    ModelState modelState = new ModelState { Value = valueResult }; 
    object actualValue = null; 
    try 
    { 
     if(!string.IsNullOrWhiteSpace(valueResult.AttemptedValue)) 
      actualValue = Decimal.Parse(valueResult.AttemptedValue, NumberStyles.Currency, CultureInfo.CurrentCulture); 
    } 
    catch (FormatException e) 
    { 
     modelState.Errors.Add(e); 
    } 

    bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
    return actualValue; 
} 
Cuestiones relacionadas