MVC3模型验证不适用于double

时间:2011-04-21 15:03:07

标签: c# asp.net-mvc-3 data-annotations

我在MVC中验证有问题,我的模型有双重属性,当我提交10.30或任何带有“。”的东西时。在里面它告诉我“价值'10 .30'对价格无效”。 我做了一些研究,他们说模型验证应该是文化不变的,我认为它可能是问题,因为我的浏览器和服务器是法语但它不应该。

这是我的代码:

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

最后,我关注了哈克德的这篇文章:

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());

答案 1 :(得分:0)

尝试在OnActionExecuting中设置文化。

顺便说一句,我发现了另一点。

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