2009-05-19 166 views
8

我已經寫了一個在IFrame中運行的Asp.Net MVC應用程序。當我的一個控制器方法返回RedirectToAction()時,我希望頂級瀏覽器URL重定向到該地址,而不僅僅是我的IFrame。我會如何去做這件事?因爲我在另一個網站內部運行,所以我需要將絕對URL傳遞給瀏覽器,即'http://parentsite.com/myapp/ {controller}/{action}'Asp .Net MVC RedirectToAction帶絕對URL

我想這相當於將我的超鏈接的目標屬性設置爲'_top ',這樣整個網站重定向(這將通過擴展HtmlHelper非常簡單),但我怎麼做我的服務器端重定向?

到目前爲止,我的解決方案是重寫OnResultExecuting,提取我打算重定向到的URL,然後重定向到一個Frame Breaker View,將我原本打算重定向的URL作爲參數傳遞。幀斷路器視圖只是寫出一些JavaScript,將頂級瀏覽器URL設置爲我的原始URL。這種方法有一個額外的HTTP請求比我想,但至少不違反任何MVC原則(我不認爲!)。思考?

感謝

回答

7

使用Redirect()而不是RedirectToAction(),並通過在URL中。

編輯:

我想你會需要一些JavaScript來脫離iframe的客戶端上。重定向到一個網址只會影響當前幀。

2

我建議延長的HtmlHelper並在服務器端使用它重定向過:

return Redirect(Url.YourExtension()); 
3

通過你的網址回你的看法也許你可以使用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>