7

En mi proyecto, deseo permitir a los usuarios ingresar valores dobles en 2 formatos: con el uso de ',' o '.' como delimitador (no estoy interesado en la forma exponencial). Por valor predeterminado con el delimitador '.' no funciona Quiero que este comportamiento funcione para todas las propiedades dobles en objetos de modelo complejo (actualmente trabajo con colecciones de objetos, que contiene identificadores y valores).Problema con el enlace de valores dobles

¿Qué debo usar: proveedores de valor o carpetas de modelos? Por favor, muestre un ejemplo de código para resolver mi problema.

+2

http://stackoverflow.com/questions/5050641/asp-net-mvc- model-binder-with-global-number-formats ¿ayuda en absoluto? – iwayneo

Respuesta

17

Se puede usar un modelo personalizado de aglutinante:

public class DoubleModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     if (result != null && !string.IsNullOrEmpty(result.AttemptedValue)) 
     { 
      if (bindingContext.ModelType == typeof(double)) 
      { 
       double temp; 
       var attempted = result.AttemptedValue.Replace(",", "."); 
       if (double.TryParse(
        attempted, 
        NumberStyles.Number, 
        CultureInfo.InvariantCulture, 
        out temp) 
       ) 
       { 
        return temp; 
       } 
      } 
     } 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

que podría estar registrada en Application_Start:

ModelBinders.Binders.Add(typeof(double), new DoubleModelBinder()); 
+0

Gracias por una respuesta clara, pero ¿cuál es el propósito de Value Providers? ¿Es la abstracción sobre diferentes fuentes (como la recolección de valores de formularios, parámetros de URL, variables del servidor, cookies, etc.)? –

+0

Además, no se olvide de agregar la misma carpeta para el tipo Nullable – vasilyk

Cuestiones relacionadas