MVC3模型验证不工作在双
本文关键字:工作 模型 验证 MVC3 | 更新日期: 2023-09-27 17:52:17
我在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; }
}
谢谢你的帮助!
最后我关注了hackack的这篇文章:
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;
}
在全局。ascx:
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
尝试在onactionexecution中设置区域性。
顺便说一句,我找到了另一个点。
public class CultureModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
System.Threading.Thread.CurrentThread.CurrentUICulture = yourCulture;
}
}