2011-04-21 53 views
5

我在MVC验证有问题,我的模型有一个双重属性,当我提交10.30或任何与“。”。它里面告诉我“价值'10.30'对价格无效”。 我做了一些研究,他们说模型验证应该是文化不变的,我想这可能是问题,因为我的浏览器和服务器是法文的,但它不应该。MVC3模型验证不工作在双重

这里是我的代码:

[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; } 
} 

感谢您的帮助!

+0

您是否尝试过进入'10,30'只是要仔细检查,如果它是一个文化问题? – StriplingWarrior 2011-04-21 15:07:37

+0

是的,我仍然有一个错误:字段价格必须是一个数字。 – VinnyG 2011-04-21 15:20:20

+0

当它与“。”它到服务器端和ModelState.IsValid = false,当它是一个“,”它不去服务器端,验证是客户端... – VinnyG 2011-04-21 15:22:09

回答

3

Finaly我遵循这个职位从Haacked:

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

它的工作原理是罚款。

下面的代码:

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; 
    } 

而在global.ascx:

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

尝试在OnActionExecuting中设置文化。

btw我发现了另一点。

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

如果我添加保护覆盖无效OnActionExecuting(ActionExecutingContext filterContext) { .CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; base.OnActionExecuting(filterContext); }我仍然有同样的问题,但在调试中我可以看到,无论如何我的CurrentCulture设置为{fr} – VinnyG 2011-04-21 15:28:56

+0

之前,它应该验证为invariantCulture权限? – VinnyG 2011-04-21 15:30:21

+0

是的。顺便说一句。我有同样的问题。在验证者运行文化的时刻尚未初始化,在我的情况德国:-) – NickD 2011-04-21 17:35:30