2

ASP.NET MVC アプリケーションで作業しています。次のようなビューモデルがあります。

public class SampleInterestViewModel
{
   //Properties defined
   //One such property that shows an error in ModelState is as follows
   public DateTime? SampleDate { get; set; }
}

UI パースペクティブから、ユーザーは日付を mmddyyyy として入力できます。また、ユーザーが 01012001 などの形式で入力すると、コントローラーの ModelState.IsValid コード部分が false を返します。ModelState をざっと見てみると、「値 01012001 は SampleDate に対して有効ではありません」というプロパティ "SampleDate" のエラーが表示されます。

モデルバインダーで、OnModelUpdated イベント中に、値 01012001 を 01/01/2001 にフォーマットしようとし、それを SampleInterestViewModel.SampleDate に戻して、ModelState.IsValid がエラーなしで true を返す可能性があると考えました。しかし、それでも ModelState.IsValid は false であり、ModelState ディクショナリを調べたところ、この特定のプロパティにはまだそのエラーがコレクションに含まれています。

最後に、01012001 をフォーマットして、値 01/01/2001 を ModelState ディクショナリのプロパティ SampleDate に直接更新しようとしました。ただし、ModelState.IsValid は false であり、SampleDate プロパティに対して同じエラーが表示されます。ModelState.IsValid が機能する理由と、いつどのように false に設定されるかを理解できません。

ユーザーが UI に 01012001 を入力した場合でも、modelbinder で 01/01/2001 にフォーマットし、ModelState.IsValid が true であることを確認して、残りのコントローラー コードが期待どおりに動作できるようにする必要があります。UI では、sampleDate 値を投稿するために AjaxSubmit を実行しています。

任意の考えやコメント。

4

2 に答える 2

4

バインドするパラメーターのホワイト リストをアクションで使用してみてください。

Bind(Include="param1,param2...")

そして、そのリストで、自分でバインドしているパラメーターを省略します。詳細については、このScottGu の投稿をお読みください。

于 2010-05-21T16:12:11.020 に答える
4

私はいくつかの解決策を見ることができます:

  1. モデル バインダーで形式を修正したら、ModelState エラーを でクリアできますModelState["SampleDate"].Errors.Clear();
  2. JavaScript を使用して入力を検証し、ユーザーに正しい形式の入力を強制します。
  3. JavaScript を使用して、フォーム投稿前にユーザーの形式を変更します。

1と2の組み合わせがベストだと思います。

于 2010-05-21T16:32:13.900 に答える