我编写了一个在IFrame中运行的Asp .Net MVC应用程序。当我的一个控制器方法返回RedirectToAction()时,我希望顶部浏览器URL重定向到该地址,而不仅仅是我的IFrame。我该怎么做呢?因为我在其他网站上运行,我需要将绝对网址传递给浏览器,即“http://parentsite.com/myapp/ {controller} / {action}”
我想这相当于将我的超链接的目标属性设置为'_top',以便整个站点重定向(通过扩展HtmlHelper,这将非常简单),但我如何为服务器端重定向执行此操作?
到目前为止,我的解决方案是覆盖OnResultExecuting,提取我打算重定向到的URL,然后重定向到Frame Breaker View,将我最初打算重定向的URL作为参数传递。 Frame Breaker View简单地写出了一些javascript,它将顶级浏览器URL设置为我的原始URL。这种方法有一个比我想要的额外的HTTP请求,但至少没有违反任何MVC原则(我不认为!)。想法?
由于
答案 0 :(得分:7)
使用Redirect()
代替RedirectToAction()
并传入网址。
编辑:
我认为你需要一些JavaScript来打破客户端的IFrame。重定向到网址只会影响当前框架。
答案 1 :(得分:3)
将您的网址传回您的视图,或者您可以在视图中使用Url.RouteUrl()。
所以例如......
public ActionResult Handback() { return View(your_absolute_url); }
然后您的View可以使用此值进行重定向。使用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>
答案 2 :(得分:2)
我建议扩展HtmlHelper并在服务器端重定向中使用它:
return Redirect(Url.YourExtension());