1

在我们的项目中,我们使用 DataAnotaions 进行输入验证。我们的验证器定期实现 IClientValidatable 并且似乎运行良好。

现在我们有一个案例,IClientValidatable 的实现是不可能的,只能实现服务器验证。

我面临的问题是默认绑定的问题,假设我有一个文本框,用户应该在此字段中输入 dateTime,用户为 DateTime 输入无效类型,例如“23453452345”,在这种情况下,默认绑定无法绑定视图模型类型 typeof(DateTime) 的值,并引发有关该类型不匹配或其他内容的一般错误。主要问题是由于绑定失败,用户在 txtbox 中输入的值会从文本框中消失。

所以它打破了常规的用户体验,打破了“可访问性”,这对我们公司来说非常重要。

问题是如何处理这个问题?

4

1 回答 1

1

您仍然可以将 jquery.validate 与自定义规则一起用于客户端验证。对于服务器端,我建议使用字符串字段作为 DateTime 值,您可以尝试在模型绑定器中将其转换为 DateTime,如果它不正确,则会引发验证错误(实际上您可以使用自定义模型绑定器)。所以在表单验证失败后你总是会保持错误的值

upd:要实现自定义模型绑定器,您需要以下步骤(没有真正检查代码,如果有任何错误,请告诉我):

在 global.asax 中:

protected void Application_Start()
{
    ModelBinders.Binders.Add(typeof(your_model_type), new YourModelTypeBinder());
}

所以现在你需要类 YourModelTypeBinder 为:

public class YourModelTypeBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var model = base.BindModel(controllerContext, bindingContext) as YourModelType;

        if (model != null)
        {
            if (bindingContext.ValueProvider.ContainsPrefix("DateTimeString"))
            {
                ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(key);
                try
                {
                    var s = valueResult.ConvertTo(string);
                    var valid = DateTime.TryParse(s, out model.RealDateTime);
                    if (!valid)
                        bindingContext.ModelState.AddModelError("DateTimeString", "Not a valid date");
                }
                catch
                {
                    bindingContext.ModelState.AddModelError("DateTimeString", "Not a valid date");
                }
            }
        }

        return model;
    }
}
于 2013-03-06T09:11:19.757 回答