我正在尝试验证文本框的输入,该输入与我的模型中的 double
类型相对应。如果用户输入"foo"
,我想知道它,以便显示错误。但是, ValueProvider
默默降低了值(没有添加错误到ModelState
)。
在正常提交中,我填写与myDouble
相对应的文本框并提交表格的"2"
。检查controllerContext.HttpContext.Request.Form
表明myDouble=2
除其他正确的输入外。bindingContext.ValueProvider.GetValue("myDouble") == 2
,如预期。bindingContext.ModelState.Count == 6
和bindingContext.ModelState["myDouble"].Errors.Count == 0
。一切都很好,模型按预期绑定。
然后,我为与myDouble
相对应的文本框填写" Foo"并提交了表格。检查controllerContext.HttpContext.Request.Form
表明myDouble=foo
,这是我期望的。但是,bindingContext.ValueProvider.GetValue("myDouble") == null
和bindingContext.ModelState.Count == 5
(确切的数字并不重要,但比以前少)。看着ValueProvider
,好像从未提交myDouble
,并且模型绑定似乎并非如此。这使得很难区分不良输入和没有输入。
这是ValueProvider
的预期行为吗?当转换失败而不实现自定义ValueProvider
时,有没有办法让ValueProvider
报告报告?谢谢!
问题的一部分是您的模型具有double
的类型。
问题是double
不能为null,因此默认值为0,因此在提交时。.如果ValueProvider
返回null,则该字段的值仍将为0,验证将通过。p>您应该使用double?
,然后将所需属性添加到属性中,使double
无效。如果不需要类型,则可以添加正则表达式验证器。
您可以使用Imodelbinder实现自定义模型绑定逻辑。这将使数据验证逻辑处于模型绑定级别 - 因此适用于任何类型的ValueProvider。在您的情况下,模型活页夹将确定当mydouble =" foo"不是双重时,并将显示无效值的模型状态错误添加例外。
public class CustomDoubleBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (controllerContext == null)
{
throw new ArgumentNullException("controllerContext");
}
if (bindingContext == null)
{
throw new ArgumentNullException("bindingContext");
}
decimal tempDouble = 0m;
if (bindingContext.ValueProvider.GetValue(bindingContext.ModelName) != null)
{
if (double.TryParse(bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue, out tempDecimal))
{
bindingContext.ModelState[bindingContext.ModelName].Errors.Add("Error parsing double value: " + bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue);
}
}
return tempDouble;
}
}
创建此自定义模型活页夹后,您将需要在global.asax:
中注册它。protected void Application_Start()
{
ModelBinders.Binders[typeof(double)] = new CustomDoubleBinder();
}