我正在asp.net MVC网站上使用datamodel验证,但我遇到了错误。
我的模型看起来像这样:
public class MyModel{
public String Name{get;set;}
public double? Value {get;set;}
}
在大多数情况下它工作正常,但如果我在“值”字段中有一个十进制值,比如“5.5”,我收到了验证错误。
该网站在“Fr-FR”区域设置下运行。我试过“5.5”或“5,5”,它们都不起作用,但我得到了不同的信息:
La valeur '5.5' n'est pas valide pour Value.
应该是"The value '5.5' isn't valide for Value"
并且
Le champ Value doit être un nombre.
这意味着"The field Value has to be a number"
我在我的代码背后的唯一逻辑是我在进行更新之前使用“ModelState.IsValid
”。
为什么这不起作用,我该怎么做才能解决这个问题?
重要编辑 通过调试,我看到我的模型的字段在带有小数的数字时变为“NULL”。
答案 0 :(得分:3)
实际上问题是客户端验证似乎适用于EN文化和带有fr-FR验证的服务器。
所以我写了一个简单的modelBinder,它是文化不变的:
public class NullableDoubleModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
ModelState modelState = new ModelState { Value = valueResult };
object actualValue = null;
if (valueResult.AttemptedValue != null)
{
try
{
actualValue = Convert.ToDouble(valueResult.AttemptedValue, CultureInfo.InvariantCulture);
}
catch (FormatException e)
{
modelState.Errors.Add(e);
}
}
bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
return actualValue;
}
}
我在Global.asax文件中注册它:
protected void Application_Start()
{
//Other stuff
ModelBinders.Binders.Add(typeof(double?), new NullableDoubleModelBinder());
}
现在它有效:)
答案 1 :(得分:1)
模仿您的错误,我的模型看起来像
public class MyModel{
public String Name{ get; set; }
public int? Value { get; set; }
}
请检查您的代码并进行编辑,因为当int更改为double 时,5.5将正常工作,除非您的控制器或模型中包含导致此验证的其他代码。