2009-05-19 56 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>