2010-04-20 24 views
20

Soy bastante nuevo a MVC pero no está seguro exactamente qué redirección ... reemplaza el redireccionamiento estándar utilizado en formularios Web, es decir, la norma Response.Redirect()ASP.NET MVC: ¿Cuál es la forma correcta de redirigir a páginas/acciones en MVC?

Por ejemplo, necesito redirigir a otras páginas en un par de escenarios:

1) Cuando el usuario cierra la sesión (Forms signout in Action) Quiero redireccionar a una página de inicio de sesión.

2) En un evento de controlador o base, por ejemplo Initialize, quiero redirigir a otra página (AbsoluteRootUrl + controlador + Acción)

Parece que varias redirecciones las llaman en algunos casos, lo que provoca errores, algo que Qué pasa con el hecho de que una página ya está siendo redirigida? ¿Cómo se puede cancelar la solicitud actual y simplemente redirigir?

Actualización:

La respuesta a esta pregunta (System.Web.Mvc.Controller Initialize) indica que Initialize no debe usarse y OnActionExecuting se debe usar?

No se debe utilizar ningún comentario sobre por qué Initialize o OnAuthorization no es una opción mejor?

Más información:

Esta entrada de blog (http://blog.wekeroad.com/blog/aspnet-mvc-securing-your-controller-actions/) indica que OnActionExecuting es útil para la autenticación (como se indica en el siguiente enlace) supongo que la adición de este a ese evento en la clase de controlador de base está muy bien ya que cada la página ejecuta una acción en MVC, por lo que no debería marcar la diferencia y tener la capacidad de redirigir debería ser más fácil. Esto tiene sentido, pero también parece tener sentido para mí que las cosas se podrían hacer en un evento antes de este evento y hace que nos preguntemos para qué sirven esos eventos. Va a dar un ir OnActionExecuting ..

+0

¿Qué es este controlador base inicializar caso de que usted ha mencionado? –

+0

@Mahesh Velaga: Tengo un controlador base que anula el evento Initialize, es decir, anulación protegida void Initialize (System.Web.Routing.RequestContext requestContext) ... Tengo algunas comprobaciones de seguridad y necesito redireccionar a los usuarios según esos controles –

+0

¿Por qué? no establece algunos valores en tempdata o viewdata y cuando alcanza la acción del controlador en función del valor que puede redirigir utilizando RedirectToAction? –

Respuesta

19

1) Cuando el usuario cierra la sesión (Formas signout en Acción) Quiero redirigir a una página de inicio de sesión.

public ActionResult Logout() { 
    //log out the user 
    return RedirectToAction("Login"); 
} 

2) En un evento de controlador o base Controlador por ejemplo Initialze, quiero redirigir a otra página (Controlador AbsoluteRootUrl + + Acción)

por qué le gustaría volver a dirigir desde un controlador de inicio?

el motor de enrutamiento se encarga de automatizar las solicitudes que vienen en, si usted quiere decir que desea redirigir a la acción index en un controlador de simplemente hacer:

public ActionResult Index() { 
    return RedirectToAction("whateverAction", "whateverController"); 
} 
+0

Puede que desee tener en cuenta que el primer elemento está en el controlador de cuenta. – GalacticCowboy

+0

Todavía creo que usar FormsAuthentication.Se debe usar RedirectToLoginPage() en lugar de devolver RedirectToAction ("Login"); –

+0

El evento de inicialización del controlador está detectando subdominios para un multi-tenancy, detectando los cambios del subdominio y comprobando la autenticación del usuario en función de esto también se hace. –

2
RedirectToAction("actionName", "controllerName"); 

Tiene otras sobrecargas, así, compruebe arriba!

Además, si eres nuevo y no estás usando T4MVC, ¡te recomendaría que lo uses!

que le da Intellisence de acciones, controladores, vistas, etc (cadenas no más mágicos)

+0

Esto es bueno para el número 1, pero no lo tiene disponible en el número 2. –

+0

De hecho, en caso número 2, el RedirectToAction parece ser ignorado? –

4

1) para redirigir a la página de inicio de sesión/desde la página de inicio de sesión, no utilice el redirect() métodos. ¡Usa FormsAuthentication.RedirectToLoginPage() y FormsAuthentication.RedirectFromLoginPage()!

2) Debería simplemente usar RedirectToAction ("acción", "controlador") en escenarios normales .. ¿Desea redirigir en el costado el método Initialize? ¿Por qué? No veo por qué querrías hacer esto, y en la mayoría de los casos deberías revisar tu enfoque.Si quieres hacer esto para la autenticación Este es definitivamente el camino equivocado (con muy pocas posibilidades enemigos por una excepción) utilizar el atributo [Authorize] en el controlador o método en lugar :)

UPD: si tiene algo de seguridad cheques en el método de iniciación, y el usuario no tiene acceso a este método, se puede hacer un par de cosas: un )

Response.StatusCode = 403; 
Response.End(); 

esto va a enviar al usuario a la página de inicio de sesión. Si desea enviarlo a una ubicación personalizada, puede hacer algo como esto (cautios: pseudocódigo)

Response.Redirect(Url.Action("action", "controller")); 

No hay necesidad de especificar la URL completa. Esto debería ser suficiente. Si insisten por completo en la dirección URL completa:

Response.Redirect(new Uri(Request.Url, Url.Action("action", "controller")).ToString()); 
+0

Hay una verificación de autenticación, pero tiene más que ver con la comprobación de un usuario contra un inquilino en una aplicación de varios inquilinos y se realizan otras comprobaciones de seguridad. Si hay una violación, el usuario debe cerrar la sesión y ser redirigido a algún lugar (esto podría ser un inicio de sesión genérico, inicio de sesión específico, página de inicio u otra página) –

+0

Bueno ... Mi respuesta parece cubrir esto, ¿no? A menos que me haya perdido algo, en cuyo caso estaré encantado de ayudarle) –

+0

Parece que los redireccionamientos no funcionan desde la inicialización, por lo que hay que reconsiderar ... agregar más información a la pregunta ... –

Cuestiones relacionadas