我在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; }
}
感谢您的帮助!
答案 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;
}
}