2

サイトのすべてのページで、Html.RenderActionを使用して一般的なログインフォームをレンダリングしています。

ユーザーがテキストボックスに詳細を入力して[送信]をクリックすると、ログインを処理するコントローラーにPOSTが実行されます。

無効な電子メールアドレスを入力するなどの間違いを犯した場合、ModelStateにエラーメッセージが表示され、以前のページにリダイレクトされます。

問題は、RenderActionが個別のリクエストとして発生するため、ViewModelが失われることです。

TempDataに入れても、TempDataは個別のリクエストごとにフラッシュされるため、失われます。

連続するHtml.RenderAction呼び出し間でデータを保持する方法はありますか?

そうでない場合、これをハックする方法についての提案はありますか?(データをセッションに入れる必要がありますか?)

4

2 に答える 2

0

これが私が当分の間行ったことです。(これはおそらく最も理想的な解決策ではありません。)

'PreserveViewDataAttribute'を作成しました。これは、セッションでViewDataを保持するアクションを実行します。

BaseControllerで、「Redirect」メソッドを独自のメソッドでオーバーライドしました。これにより、次のことが実行されます。

  1. それを呼び出したActionメソッドへの参照を取得します(ここでは少し反省します)

  2. このメソッドに「PreserveViewDataAttribute」が定義されているかどうかを確認します

  3. 含まれている場合は、現在のViewDataをSession変数にコピーします。(変数のラベルは現在のアクション名と同じですが、最後に「_ViewData」が追加されています。)

  4. いずれの場合も、基本のRedirectメソッドを呼び出します。

次に、BaseControllerに「PreservedViewData」というプロパティを作成しました。これは、現在のアクションに関連するセッション内のViewDataを返します。(または、見つからない場合はnullを返します)。

したがって、ViewDataを必要なだけ保持するには、アクションを「PreserveViewDataAttribute」で装飾し、必要なときに「PreservedViewData」を呼び出すだけです。

これのソースコードが必要な場合はお知らせください。

于 2009-09-11T05:17:50.940 に答える
-1

KaziRashidによるこのPost-Redirect-Getセクションのアプローチがお気に召すかもしれません。

http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx#prg

于 2009-10-24T16:17:04.890 に答える