Asp .Net MVC RedirectToAction с абсолютным URL - PullRequest
8 голосов
/ 20 мая 2009

Я написал приложение Asp .Net MVC, которое работает внутри IFrame. Когда один из моих методов контроллера возвращает RedirectToAction (), я хочу, чтобы верхний URL браузера перенаправлял на адрес, а не только на мой IFrame. Как бы я поступил так? Поскольку я работаю на другом сайте, мне нужно будет передать браузеру абсолютный URL-адрес, т. Е. 'http://parentsite.com/myapp/{controller}/{action}'

Полагаю, это эквивалентно установке целевого атрибута моих гиперссылок на «_top», чтобы весь сайт перенаправлял (это будет довольно просто, если расширить HtmlHelper), но как мне сделать это для перенаправлений на стороне сервера?

Пока что мое решение состоит в том, чтобы переопределить OnResultExecuting, извлечь URL-адрес, на который я собираюсь перенаправить, а затем вместо этого перенаправить в представление разрыва фрейма, передав URL-адрес, на который я первоначально собирался перенаправить, в качестве параметра. Представление Frame Breaker просто записывает некоторый javascript, который устанавливает верхний URL браузера в мой исходный URL. У этого подхода есть дополнительный HTTP-запрос, чем я хотел бы, но по крайней мере не нарушает никаких принципов MVC (я не думаю!). Мысли

Спасибо

Ответы [ 3 ]

7 голосов
/ 20 мая 2009

Используйте Redirect() вместо RedirectToAction() и передайте в URL.

Edit:

Я думаю, вам понадобится немного JavaScript, чтобы выйти из IFrame на стороне клиента. Перенаправление на URL будет влиять только на текущий кадр.

3 голосов
/ 20 мая 2009

Верните свой URL обратно вашему представлению или, возможно, вы можете использовать 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 голосов
/ 20 мая 2009

Я бы порекомендовал расширить HtmlHelper и использовать его также в перенаправлениях на стороне сервера:

return Redirect(Url.YourExtension());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...