2008-10-20 13 views
17

En ASP.net MVC, ¿cuál es la forma "correcta" de que un controlador devuelva una redirección 301 a un sitio externo?Devolución de una redirección 301 desde una acción de controlador

Parece que las diversas funciones RedirectTo devuelven enlaces relativos o rutas que he correlacionado manualmente, pero no hay forma de decir "Realizar un redireccionamiento 301 a http://example.com".

Creo que podría simplemente establecer Response.StatusCode o usar Response.Redirect, pero ¿así es como debe hacerse en MVC? ¿O hay una "forma correcta" oficial de realizar redirecciones?

Actualización: Mientras tanto, me escribió un ActionResult para ello: PermanentRedirectResult

Actualización 2: Desde ASP.net 4.0, redirecciones permanentes son part of the Framework.

Respuesta

1

Como está hablando de redireccionar a una URL que no conoce nada sobre el enrutamiento (ya sea una página interna (piense en ASP.NET clásico) o algún recurso externo), entonces lo único que puede hacer es establecer el código de estado, y envía el navegador del usuario en su camino.

En esta cadena en MVC le preocupa que el usuario obtenga su Vista, pero esa Vista no está bajo su control y puede que ni siquiera sea una Vista en absoluto. Entonces, en última instancia, estás haciendo lo mejor que puedes en esta circunstancia y, que yo sepa, no están incumpliendo ninguna "regla" de MVC.

Espero que ayude.

+2

Ese es el enfoque que he elegido ahora, estoy estableciendo Response.StatusCode en 301 y Response.RedirectLocation en la URL de destino –

0

¿Eso ayuda? http://blog.eworldui.net/post/2008/04/ASPNET-MVC---Legacy-Url-Routing.aspx

Parece que solo tendría que reemplazar la ruta virtual por una URL de su agrado.

+0

Problema con ese enfoque: parece que tengo que agregar la ruta a mis rutas, pero como no conozco la URL de destino antes de la acción de controlador, no puedo ponerla en la tabla de rutas, y dado que las URL son una -tiempo de uso solamente, no quiero agregar rutas innecesarias en la tabla. –

1

Realizo redireccionamientos para admitir URL heredadas.

Mi controlador se ve algo así como & hellip;

Public Class ThingController 
    Inherits System.Web.Mvc.Controller 

    Function Details(ByVal id As String) As ActionResult 
     Dim RedirectId As Guid 
     Select Case key 
      Case "legacyurlone" 
       RedirectId = New Guid("c564c0c1-c365-4b0c-bc33-fd4eadf0551b") 
      Case "legacyurltwo" 
       RedirectId = New Guid("157fa15b-8d5d-4f04-87cc-434f7ae93dfa") 
      Case Else 
       RedirectId = Guid.Empty 
     End Select 
     If Not RedirectId = Guid.Empty Then 
      Response.StatusCode = Net.HttpStatusCode.MovedPermanently 
      Response.RedirectLocation = Url.RouteUrl("IdOnly", New With {.id = RedirectId}) 
      Return Nothing 
     End If 
     Dim ThingId As Guid = New Guid(id) 
     Dim db As New ThingEntities 
     Dim Model As Thing = ... 
     Return View(Model) 
    End Function 

    ... 

End Class 

Ahora me pregunto si podría manejar esto más limpiamente con dos rutas y funciones de controlador.

16

Uso

Response.RedirectPermanent("http://www.google.com"); 

o para el retorno de un tipo ActionResult desde un controlador:

return RedirectPermanent("http://www.google.com"); 

proporcionada por el 4,0 marco ASP.net.

Cuestiones relacionadas