2010-05-12 186 views
25

He utilizado response.redirect en los formularios web ASP y ASP.NET clásicos. Sin embargo, con MVC 2.0, me encuentro con algo peculiar.En ASP.NET MVC, ¿cómo funciona response.redirect?

Tengo un método privado en una clase de controlador que es utilizado por múltiples métodos de controlador para ayudar a cargar y validar cierta información. Este método privado está configurado para redirigir si se descubre un problema en una página de mensaje de error genérico.

El gran problema que estoy notando es que la clase del controlador de llamadas y la vista de página intentan completar el procesamiento y la carga antes de que la redirección realmente tenga lugar. Esto es molesto en el desarrollo porque la Vista arroja excepciones que necesito ignorar antes de que se cargue finalmente la página de error genérica.

Como se mencionó anteriormente, estoy acostumbrado al modelo anterior de response.redirect que impedía que se ejecutara el código subsiguiente en una página, ya que la nueva página se cargaba.

Cualquier ayuda o consejo sobre redirecciones en MVC sería muy apreciada.

+1

Por favor, muéstranos tu código. – SLaks

+0

¿Alguna vez has oído hablar de una herramienta de diagnóstico llamada "Fiddler"? Puede que le resulte muy útil para ver lo que están haciendo sus páginas. –

+0

Supongo que está llamando 'Response.Redirect' en su método privado? –

Respuesta

42

El mecanismo convencional para redirigir en ASP.Net MVC es devolver un objeto de tipo RedirectResult al cliente. Si esto se hace antes de que se llame a su método de Vista, nunca se invocarán sus métodos de vista.

Si llama a Response.Redirect, en lugar de dejar que el controlador frontal de Asp.Net MVC lo haga por usted, su método de control continuará hasta que finalice o arroje una excepción.

La solución idiomática para su problema es hacer que su método privado devuelva un resultado que su controlador pueda usar.

por ejemplo:

public ActionResult Edit(MyEntity entity) 
{ 
    if (!IsValid()) return Redirect("/oops/"); 
    ... 
    return View(); 

} 

private bool IsValid() 
{ 
    if (nozzle==NozzleState.Closed) return false; 
    if (!hoseAttached) return false; 
    return (userRole==Role.Gardener); 
} 
+0

Esto explica lo que estaba viendo, y es una gran solución. ¡Gracias por la ayuda! – Swoop

+0

Hola, Jason, ¿puedes comentar por qué el código continúa en lugar de que se cancele el hilo, según WebForms 'Response.Redirect'? –

+0

@JasonTrue: Sí, yo también me preguntaba por qué el hilo no termina. –

18

En ASP.NET MVC, normalmente se redirigiría a otra página devolviendo un RedirectResult desde el método del controlador.

Ejemplo:

public ActionResult Details(int id) 
{ 
    // Attempt to get record from database 
    var details = dataContext.GetDetails(id); 

    // Does requested record exist? 
    if (details == null) 
    { 
     // Does not exist - display index so user can choose 
     return RedirectToAction("Index"); 
    } 

    // Display details as usual 
    return View(details); 
} 
+0

Gran respuesta. ¡Gracias por la ayuda! – Swoop

-3

probar este código en la vista MVC página veta

 if (Session["UserName"] == null) 
     { 
      this.Response.Redirect("LogOn"); 

     } 
+4

Recomendamos encarecidamente llamar a Response.Redirect en aplicaciones MVC. Debería devolver un RedirectResult de acciones o filtros. – RickAndMSFT

+0

@RickAnd - MSFT ¿Por qué, se desalienta? Sé que, obviamente, RedirectResult es superior, pero ¿por qué se desaconseja Response.Redirect? –

+0

Una buena pregunta, consulte mi blog Response.Redirect y ASP.NET MVC - No mezclar en http://blogs.msdn.com/b/rickandy/archive/2012/03/01/response-redirect-and-asp- net-mvc-do-not-mix.aspx – RickAndMSFT

7

En MVC nunca use Response.Redirect uso

return RedirectToAction("ActionResultName", "ControllerName"); 

de por qué a NO use Response.Redirect en MVC:

  1. Problemas de rendimiento con él
  2. No siguiendo el patrón asp.net MVC estándar y las convenciones que se han creado específicamente para MVC.
1

es la única manera de redireccionar a asp.forma neta en acción del controlador MVC utilizando

return Redirect("/page/pagename.aspx"); 

otra manera podemos redirigir mediante el uso (no recomendado y mala manera)

Response.Redirect("/page/pagename.aspx", true); 

va a trabajar para redirección, pero el problema es que se eliminarán todos nuestros valores de sesión Entonces, ¿por qué no es recomendable?

Cuestiones relacionadas