6

ユーザーが複数のページにまたがる複数ステップのフォームに入力する Web アプリケーションに取り組んでいます。フォームの上部にはタブ ナビゲーションがあり (これらのリンクは現在のページを送信しません)、下部に [次へ] ボタンがあります (送信します)。フォームの送信/検証を処理するためのいくつかの戦略を検討しています。

  1. フォーム ページごとに 1 つのアクション メソッドとビュー。次へを押すと、次のページのアクション メソッドにフォームを送信します。検証エラーがある場合は、前のページにリダイレクトされます。

    • URL は説明的であり、コピーして貼り付けることができます
    • エラーの場合のみリダイレクト
    • リダイレクトにはフォームデータがないため、送信に関するコンテキストが失われ、特定のエラーメッセージを表示するのが難しくなります
    • ユーザーがまだ準備ができていないフローのステップにアクセスしようとした場合、ユーザーをリダイレクトするために同じ検証ロジックが機能します。
  2. フォーム ページごとに 1 つのアクション メソッドとビュー。次にヒットすると、フォームが現在のページ アクションに送信されます。検証エラーがある場合、同じビューが返されます。それ以外の場合は、次のページ アクションにリダイレクトします。

    • URL は説明的であり、コピーして貼り付けることができます
    • リダイレクトは非常に一般的です (これが悪いかどうかはわかりません)
    • 検証エラーを表示するときは、フォーム送信と同じリクエストにいるため、無効な入力に完全にアクセスできます
    • たとえば、送信も行う「前へ」ボタンを追加する機能が必要な場合は、追加のコンテキストを渡す必要があります
  3. すべてのページに対して 1 つのアクション メソッド。URL には、送信されるステップに関する追加のコンテキストが含まれています (例: MyController/MyAction/{step})。コントローラ メッセージは、検証と現在のステップに応じて、返すビュー ページを選択します。

    • URL は説明的ではありません (たとえば、ステップ 1 を送信してステップ 2 に進むと、ページ 1 (無効) またはページ 2 が返されるかどうかに関係なく、ユーザーに表示される URL は同じになります)
    • リダイレクトなし
    • 検証エラーを表示するときは、フォーム送信と同じリクエストにいるため、無効な入力に完全にアクセスできます
  4. ここにリストしていない別の方法

各方法の長所と短所のいくつかを列挙しようとしましたが、知りたいと思います。

  • これらの方法の他の長所と短所は何ですか? 私のは正しいですか?私がリストした短所のいくつかは、設計されている可能性がありますか?
  • 私が使用すべきこの問題への標準的なアプローチはありますか? もしそうなら、なぜそれが標準的なアプローチなのですか?
4

1 に答える 1

2

マイナーな変更を加えたオプション 2 を強くお勧めします。アクション/ビューごとに 1 つのビュー モデルを作成することも検討したい場合があります。すべてのページにまたがる 1 つのモデルがある場合、すべてのプロパティで検証が行われます。つまり、ユーザーが各画面でモデルの一部しか編集できない場合でも、表示できないプロパティについて検証の警告が表示される可能性があります。最近プロジェクトでこれを行いましたが、見事に機能しました。すべてを元に戻すには、バックエンドでデータ操作を行う必要がありますが、最終的にはその価値がありました。

あなたが言ったように、あなたの URL はディープリンク可能です。つまり、ユーザーはコピー/貼り付けができます。さらに重要なことに、ブラウザーでそのページをお気に入りとして追加できるため、同じ場所に非常に簡単に戻ることができます。私の意見では、これによりオプション 3 は時代遅れになります。

また、ナビゲーションのすべてのロジックが 1 か所で発生するという利点もあります。コントローラーが送信時に何をすべきかを認識できるように、「ウィザード」の状態 (現在表示しているページ) をクライアントに保存する必要があります。ウィザードの状態を分析し、ユーザーが次に進むべき場所を決定する必要があります。オプション 1 を使用すると、どこから「来た」のかがわからず、サーバー検証エラーをクライアントに表示するのが難しくなります。これは、POST - REDIRECT - GET パターンの美しい例です。各ページには、単純な ID を取る GET と、より複雑なモデルを取る POST の 2 つのアクションがあります。サーバーに投稿し、次にどこに行くべきかを判断し、GET にリダイレクトします。

最後に、フォームを送信するのではなく、単に前のステップに直接リンクする前のボタンを検討してください。そうしないと、ユーザーが無効なステップでスタックする可能性があります。これは私たちに起こりましたが、非常にうまく機能しました。

うまくいけば、これは役に立ちました。幸運を!

于 2012-11-29T23:12:22.587 に答える