AjaxSubmit を使用してフォームを投稿していますが、XVal (RuleException の方法) を使用してサーバー側の検証が行われています。モデルにエラーを追加してビューに送信するために、try/catch の方法を使用していません。代わりに、HandleError 属性を使用したいので、OnException でモデルにエラーを追加しています。主な問題は、Ajax Call の結果としてこれらのエラーを取得するにはどうすればよいかということです。
1 に答える
現在、組み込まれている優れたソリューションはありません。これを正しく行うにはクライアント側の検証フレームワークが必要ですが (エラーを表示するには、HTML ページを動的に変更する必要があるため)、最近まで ASP.NET MVC にはそれがありませんでした。ただし、ASP.NET MVC 2 Preview 2 ではクライアント側の検証が導入されたため、フレームワークに何かがすぐに組み込まれる可能性があると推測するのが妥当です。
ただし、それまでの間、HandleErrorAttribute は役に立ちません。HandleErrorAttribute は、エラー ページにリダイレクトする方法しか認識していません。これは、通常、「通常の」POST を使用した場合でも、サーバー側の検証エラーに応答してやりたいことではありません。
実際には、処理する必要がある 2 つの異なるシナリオがあります。
- 検証エラーは壊滅的な失敗ではありません。これらは単純に悪いユーザー データであり、当然のことです。情報をページに戻すだけで、ページをマークアップしてユーザーにデータの修正方法を伝えることができます。
- また、予期しない例外などの壊滅的な障害にも対処する必要があります。これは、ユーザーにメッセージを表示できる限り、HandleErrorAttribute が行うことと似ていますが、そのメッセージをページの特定のフィールドと必ずしも一致させることはできません。
エラーの最初のシナリオを処理するには、モデルの状態を JavaScript コードで解析可能なオブジェクトにラップする必要があります。ここでは JSON が明らかに適しています。次に、このオブジェクトを解析してフォーム フィールドをマークアップする JavaScript コードをクライアント側に用意する必要があります。これは、フォーム フィールドをマークアップするためのコードが既に含まれている既存のクライアント側の検証フレームワークに結び付けると、より簡単になります。
2 番目のタイプのエラーを処理するには、壊滅的な障害が発生した場合に HTML ではなく JSON を提供するために、HandleErrorAttribute を拡張できます。繰り返しになりますが、障害が発生した場合に実行される JavaScript コードを作成する必要があります (ここでは jQuery のグローバルajaxError
イベントが役立ちます)。このコードは、作成したこの構造化されたエラー情報を検出し、何らかの有用なメッセージをユーザーに表示します。
これが少し複雑に聞こえるかもしれませんが、MVC 2 が最終的にリリースされたときに何が組み込まれるかを待つ方が理にかなっています。