web-dev-qa-db-ja.com

Asp.net MVC2の子アクションでリダイレクト結果が許可されないのはなぜですか

Asp.Net FuturesRenderActionメソッドを使用してレンダリングする部分的なアクションがいくつかあります。これらの一部は、フォーム内のフォームが処理された後にリダイレクトを実行します。

Asp.Net MVC 2 RCにアップグレードしたので、「子アクションはリダイレクトアクションを実行できません」というエラーが表示されます。

ソースコードを調べたところ、例外をスローする行が見つかりました。それを回避するために、カスタムRedirectResultを作成できますが、その前に、フレームワークがそもそもそれを許可しない理由を理解したいと思います。正当な理由があるに違いありません、そして多分私もそうすべきではありません。

この制限の理由を知っている人はいますか?

ありがとう

23
Sruly

MVCはすでにクライアントへのビューのレンダリングを開始しているため、制限が存在します。この時点からのリダイレクトの影響は定義されていません。完全に機能する可能性があり、リダイレクトせずに元のビューをレンダリングし続ける可能性があり、別の例外をスローする可能性があります。

このアクションを実行した結果は未定義であるため、フレームワークはそれをブロックします。実際には、同様の理由で、RenderActionを使用してビュー(またはビューのようなコンテンツ)以外のものをレンダリングしないでください。

あなたの特定のケースでは、外側のアクションはリダイレクトする必要があります。とにかくユーザーに何も表示せずにビュー内からリダイレクトすることになった場合、外部アクションが作業を適切に委任する可能性があるため、そもそもビューを通過する目的はありませんでした。自分の。

36
Levi

チャイルドアクションで次のようなものを使用してみてください。

ControllerContext.HttpContext.Response.Redirect(ControllerContext.HttpContext.Request.Url.ToString());
17
ybigus

私の解決策。

アクション方法:

return View("Redirect", model);

見る:

<script type="text/javascript" language="javascript">
    document.location = '<%: Url.Action("Index", "Album", new { id = Model.Id }) %>';</script>
13
Vladimir

私の場合、レンダリングされるフォームは、構築しているWebサイトの拡張機能の「構成」パネルです。拡張機能自体のコントローラーでフォーム処理を処理してから、構成済みのすべての拡張機能を一覧表示する管理ページにリダイレクトできるようにしたいと思います。ここでは、親ページのコントローラーに拡張機能のフォームを処理するように依頼することは適切または実用的ではないと思います。代わりに私が何をすることを提案しますか?

6
Jason Barile

私の珍しいケースでは、子アクションでリダイレクトしようとしたカスタムAuthorizeAttributeがコントローラーにアタッチされていましたが、これは(上記のように)許可されていません。

この問題を解決するために、すべての子アクションの承認チェックリダイレクトを削除しました。

Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext)
    //Child actions cannot redirect anyway, so no need to check permissions.
    If filterContext.IsChildAction Then Exit Sub

    .. parent authorisation checks ..
5
Jonathan

基本アクション結果のアクションをレンダリングしようとすると、このエラーが発生することがありました。例:

ActionResult X
    Return View
View X
    RenderAction Y

ActionResult Y
    // Bla bla
       return View 
    // else
       return RedirectToAction X
3
gandil

その場合は、問題のあるリダイレクトのターゲットであったアクションへの部分ビューフォームの送信URLをポイントし、GETバージョンへのリダイレクトを実行させます。

1
aaimnr