質問

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

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

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

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

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

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

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

役に立ちましたか?

解決

ここで私がとりあえずやったことです。 (これはおそらく最も理想的なソリューションではありません。)

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

BaseControllerで、次の処理を行う「Redirect」メソッドを独自のメソッドでオーバーライドしました。

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

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

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

  4. どちらの場合でも、ベースのリダイレクトメソッドを呼び出します。

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

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

これにソースコードが必要かどうか教えてください。

他のヒント

Kazi Rashidによるこのリダイレクト後取得セクションのアプローチがお気に召すかもしれません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top