2009-05-19 15 views
8

私はIFrameの内部で実行されるAsp .Net MVCアプリケーションを作成しました。私のコントローラメソッドの1つがRedirectToAction()を返すとき、トップのブラウザURLが私のIFrameだけでなく、アドレスにリダイレクトされるようにしたい。これをどうやってやりますか?別のサイト内で実行しているため、絶対URLをブラウザに渡す必要があります。つまり、 'http://parentsite.com/myapp/ {controller}/{action}'Asp .Net MVC絶対URLでのリダイレクトToAction

私のハイパーリンクのターゲット属性を '_top 'これでサイト全体がリダイレクトされるようになります(これはHtmlHelperを拡張することでかなり簡単になります)。しかし、サーバーサイドのリダイレクトではどうしたらいいですか?

これまでのところ、私の解決策は、OnResultExecutingをオーバーライドして、リダイレクト先のURLを抽出し、その代わりに元々はリダイレクト先のURLを渡すフレームブレーカービューにリダイレクトすることです。フレームブレーカビューは、トップブラウザのURLを元のURLに設定するJavaScriptを書き出すだけです。このアプローチは私が望むよりも余分なHTTP要求を持っていますが、少なくともMVCの原則に違反しているわけではありません(私は思っていません!)。思考?

おかげ

答えて

7

利用Redirect()代わりのRedirectToAction()とURLを渡します。

編集:

私はあなたが、クライアント側でのIFrameから抜け出すためにいくつかのJavaScriptを必要とすると思います。 URLへのリダイレクトは、現在のフレームにのみ影響します。

2

私はHtmlHelperのの延長をお勧めしますし、あまりにもリダイレクトサーバー側でそれを使用したい:

return Redirect(Url.YourExtension()); 
3

が戻ってあなたのビューにあなたのURLを渡すか、多分あなたは、ビュー自体にUrl.RouteUrl()を使用することができます。

したがって、たとえば...

 
public ActionResult Handback() 
{ 
    return View(your_absolute_url); 
} 

は、その後、あなたのビューには、リダイレクトを行うには、この値を使用することができます。 Javascriptを使用して親が存在するかどうかを検出し、現在のウィンドウ内でそれ以外の場所を設定します。以下の例では、厳密に型指定されたビューを使用する代わりに、特定のコントローラ/アクションに対してRouteUrlを使用しています。

これが役に立ちます。

 
<html> 
<head> 
    <title></title> 
</head> 
<body> 
    <script type="text/javascript"> 
     if (window.parent != null) 
      window.parent.location = '<%= Url.RouteUrl(new { 
        controller = "MyController", action = "MyAction" }) %>'; 
     else 
      window.location = '<%= Url.RouteUrl(new { 
        controller = "MyController", action = "MyAction" }) %>'; 
    </script> 
</body> 
</html>