具有绝对URL的Asp .Net MVC RedirectToAction

时间:2009-05-19 21:59:25

标签: asp.net asp.net-mvc

我编写了一个在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原则(我不认为!)。想法?

由于

3 个答案:

答案 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());