私たちのサイトには、さまざまなデータがいくつかのページにわたって収集される複数の「ウィザード」があり、最後のステップまでデータベースにコミットすることはできません。
ASP.Net MVC でこのようなウィザードを作成するための最良/正しい方法は何ですか?
編集: 私の上司は現在、「javascript はありません」と言っています。その制限を回避する方法について何か考えはありますか?
私たちのサイトには、さまざまなデータがいくつかのページにわたって収集される複数の「ウィザード」があり、最後のステップまでデータベースにコミットすることはできません。
ASP.Net MVC でこのようなウィザードを作成するための最良/正しい方法は何ですか?
編集: 私の上司は現在、「javascript はありません」と言っています。その制限を回避する方法について何か考えはありますか?
最善/正しい方法があるとは思いませんが、私が行う方法は...
各ウィザードには独自のページがあります。各ステップは独自の div を取得します。すべてのステップは同じ形式です。
前/次のボタンは、基本的に、プロセスの各ステップで div を非表示/表示します。最後のステップの送信ボタンは、フォーム全体を送信します。jQuery を使用してこれを実装するのは非常に簡単で、ウィザードのすべてのステップが単一の ViewPage にあるため、保守が容易です。
コントローラー側には、表示用にフォームを準備する HttpVerbs.Get バージョンと、FormsResult を取得して解析し、ユーザーの回答を送信するために必要な情報を取得する HttpVerbs.Post バージョンの 2 つのコントローラー メソッドがあります。ストレージ/その他のプロセスへ。
うわー、あなたの上司は臭いです。
この回答は、javascript が無効になっている ****** 人 (はい、両方とも) にはほとんど問題なく機能します。CSS を介して前後のボタンを非表示にし、JavaScript コードで再表示するように微調整できます。このように、JavaScript を使用するユーザーにはウィザードが表示され、JavaScript を使用しないユーザーにはフォーム全体が表示されます (次へ/前へのボタンなし)。
もう 1 つのオプションは、ウィザードの各ステップのビューを作成することです。フォームの中間結果をセッションに保存できます。この方法を実装するには多くの時間と労力がかかります。つまり、昼食時に費やす約 20 分間の労力で、javascript ルートがいかに簡単に実装できるかを示すことで、おそらく上司の残業をいくらか搾り取ることができるでしょう。
JavaScriptを使用できない場合は、コントローラーのメソッドを使用して各ステップをビューにし、データベースに送信する準備ができるまでデータをセッションに保持します。
ActionLink HtmlHelperメソッドを使用して、[次へ]ボタンと[前へ]ボタンを作成できます。
もう1つの方法は、ウィザードで作成している不完全なオブジェクトをデータベースに保存し、主キーをウィザードの次のステップに渡すことです。これは、データベースフィールドの一部をnull許容にする必要があることを意味しますが、主キーをCookieに保存して、ユーザーが後でウィザードに戻ることができるという追加の利点があります。このオプションは、JavaScriptまたはセッション状態を必要としません。
さまざまなパネルをすべてクライアント側にして...すべて同じフォームに...そして最後の送信ボタンを押すと、すべての値を同時に投稿できます。
Javascript を使用できず、セッション変数でサーバー リソースを使いたくない場合は、別のステップで入力される値をシリアル化および逆シリアル化し、非表示の入力フィールドを使用して前後に渡すこともできます。ASP.NET Webforms の ViewState に少し似ています。
ログイン ウィザードを作成し、その背後にあるアイデアをブログに記録しました。リンク テキスト
NuGetで利用可能な単純なコンポーネントMVCWizard.Wizardを使用できます。WizardControllerを使用すると、部分ビューを使用してウィザードを作成できます。ウィザード全体を単一のビューでレンダリングするAutoWizardControllerもあります。これらのコンポーネントはすべて、セッションで動作してモデルの状態を保存します。
この質問には、非常にシンプルで柔軟で拡張可能な方法があります: How to simple my statefull interlaced modal dialogs in ASP.NET MVC