2009-05-19 20 views
8

He escrito una aplicación Asp .Net MVC que se ejecuta dentro de un IFrame. Cuando uno de mis métodos de controlador devuelve RedirectToAction(), quiero que la URL del navegador superior se redirija a la dirección, no solo a mi IFrame. ¿Cómo voy a hacer esto? Como estoy ejecutando dentro de otro sitio, tendré que pasar una URL absoluta al navegador, es decir, 'http://parentsite.com/myapp/ {controller}/{action}'Asp .Net MVC RedirectToAction con la URL absoluta

Supongo que es el equivalente a establecer el atributo de destino de mis hipervínculos en '_top 'para que todo el sitio redireccione (esto será bastante sencillo al extender el HtmlHelper), pero ¿cómo lo hago? Lo hago para las redirecciones del lado del servidor.

Hasta ahora, mi solución es anular OnResultExecuting, extraer la URL a la que pretendo redireccionar, luego, redireccionar a una Vista de Frame Breaker pasando la URL que originalmente pretendía redirigir como parámetro. La ventana Frame Breaker View simplemente escribe un javascript que establece la URL del navegador principal en mi URL original. Este enfoque tiene una solicitud HTTP adicional de la que me gustaría, pero al menos no infringe ningún principio de MVC (¡no lo creo!). ¿Pensamientos?

Gracias

Respuesta

7

Use Redirect() en lugar de RedirectToAction() y pase en el URL.

Editar:

creo que necesita algo de JavaScript para salir del marco flotante en el lado del cliente. El redireccionamiento a una url solo afectará al cuadro actual.

2

me gustaría recomendar la ampliación de la HtmlHelper y lo uso en el lado del servidor redirige también:

return Redirect(Url.YourExtension()); 
3

pasar su URL de nuevo a su punto de vista o tal vez usted podría utilizar Url.RouteUrl() en el propio Vista.

Así, por ejemplo ...

 
public ActionResult Handback() 
{ 
    return View(your_absolute_url); 
} 

Luego, su vista se puede utilizar este valor para hacer una redirección. Use Javascript para detectar si hay un padre, luego configure la ubicación, de lo contrario, hágalo en la ventana actual. El siguiente ejemplo, en lugar de utilizar la vista fuertemente tipada, usa RouteUrl para un controlador/acción específico.

Espero que esto ayude.

 
<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> 
Cuestiones relacionadas