ASP.NET MVC3 ValueProvider将字符串输入丢弃到双属性



我正在尝试验证文本框的输入,该输入与我的模型中的 double类型相对应。如果用户输入"foo",我想知道它,以便显示错误。但是, ValueProvider默默降低了值(没有添加错误到ModelState)。

在正常提交中,我填写与myDouble相对应的文本框并提交表格的"2"。检查controllerContext.HttpContext.Request.Form表明myDouble=2除其他正确的输入外。bindingContext.ValueProvider.GetValue("myDouble") == 2,如预期。bindingContext.ModelState.Count == 6bindingContext.ModelState["myDouble"].Errors.Count == 0。一切都很好,模型按预期绑定。

然后,我为与myDouble相对应的文本框填写" Foo"并提交了表格。检查controllerContext.HttpContext.Request.Form表明myDouble=foo,这是我期望的。但是,bindingContext.ValueProvider.GetValue("myDouble") == nullbindingContext.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();
}

相关内容

  • 没有找到相关文章

最新更新