2011-04-21 11 views
5

Tengo un problema con la validación en MVC, mi modelo tiene una propiedad doble y cuando presento 10.30 o algo con "." dentro de él me dice que "El valor '10 .30 'no es válido para Price". Hice algunas investigaciones y dicen que la validación del modelo debería ser invariante de la cultura, pensaba que podría ser el problema, ya que mi navegador y mi servidor están en francés, pero no deberían.MVC3 La validación del modelo no funciona en un doble

Aquí está mi código:

[HttpPost] 
     [ValidateAntiForgeryToken] 
     [Authorize(Roles = "Admin")] 
     [ValidateInput(false)] 
     public virtual ActionResult Edit(AuctionModel model) 
     { 
      if (ModelState.IsValid) 
      { 
       //do the work 
      } 
      return View(model); 
     } 

public class AuctionModel 
    { 
     public string Id { get; set; } 
     [Required(ErrorMessageResourceType = typeof(Strings), ErrorMessageResourceName = "FieldMandatory")] 
     [LocalizedDisplayName("Title")] 
     public string Title { get; set; } 
     [Required(ErrorMessageResourceType = typeof(Strings), ErrorMessageResourceName = "FieldMandatory")] 
     [LocalizedDisplayName("Description")] 
     public string Description { get; set; } 
     [Required(ErrorMessageResourceType = typeof(Strings), ErrorMessageResourceName = "FieldMandatory")] 
     [LocalizedDisplayName("Photo")] 
     public string Photo { get; set; } 
     [Required(ErrorMessageResourceType = typeof(Strings), ErrorMessageResourceName = "FieldMandatory")] 
     [LocalizedDisplayName("StartDate")] 
     public DateTime StartDate { get; set; } 
     [Required(ErrorMessageResourceType = typeof(Strings), ErrorMessageResourceName = "FieldMandatory")] 
     [LocalizedDisplayName("Price")] 
     public double Price { get; set; } 
} 

Gracias por la ayuda!

+0

has necesitado entrar '10,30' acaba de volver a verificar si se trata de una cuestión de cultura? – StriplingWarrior

+0

Sí y todavía tengo un error: el campo Precio debe ser un número. – VinnyG

+0

Cuando está con un "." va del lado del servidor y ModelState.IsValid = false y cuando es un "," no va del lado del servidor, la validación es del lado del cliente ... – VinnyG

Respuesta

3

Finaly me siguen este post de Haacked:

http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx

y funciona como bien.

Aquí está el código:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     var modelState = new ModelState { Value = valueResult }; 
     object actualValue = null; 
     try 
     { 
      actualValue = Convert.ToDecimal(valueResult.AttemptedValue, CultureInfo.InvariantCulture); 
     } 
     catch (FormatException e) 
     { 
      modelState.Errors.Add(e); 
     } 

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

Y en el global.ascx:

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder()); 
0

Intenta establecer la cultura en OnActionExecuting.

por cierto, encontré otro punto.

public class CultureModelBinder : DefaultModelBinder 
{  
     public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      System.Threading.Thread.CurrentThread.CurrentUICulture = yourCulture; 
     } 
} 
+0

Si agrego la anulación protegida void OnActionExecuting (ActionExecutingContext filterContext) Thread .CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; base.OnActionExecuting (filterContext); } Todavía tengo el mismo problema, pero en Depurar puedo ver que antes de que mi CurrentCulture se establezca en {fr} – VinnyG

+0

de todos modos, debe validar invariantCulture ¿no? – VinnyG

+0

sí. por cierto. Yo tuve el mismo problema. en el momento en que se ejecutan los validadores, la cultura aún no se había inicializado y en mi caso alemán :-) – NickD

Cuestiones relacionadas