1

私たちのプロジェクトでは、入力の検証に DataAnnotations を使用しています。私たちのバリデーターは定期的に IClientValidatable を実装しており、うまく機能しているようです。

現在、IClientValidatable の実装が不可能で、サーバーの検証しか実装できない場合があります。

私が直面した問題は、デフォルトバインディングの問題です。ユーザーがこのフィールドにdateTimeを入力する必要があるテキストボックスがあるとしましょう。ユーザーはDateTimeに無効なタイプを入力します。たとえば、「23453452345」とします。この場合、デフォルトバインディングはバインドに失敗しましたvalue を viewmodel 型 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 に答える