2010-01-13 18 views
21

Tengo algunas acciones parciales que realizo con el método Asp.Net Futures RenderAction. Algunos de estos realizan redireccionamientos una vez procesados ​​los formularios.Por qué no se permiten los resultados de redireccionamiento en Acciones secundarias en Asp.net MVC 2

Ahora que me actualicé a Asp.Net MVC 2 RC me da un error "Las acciones secundarias no pueden realizar acciones de redireccionamiento".

Revisé el código fuente y encontré la línea que arroja la excepción. Para evitarlo puedo hacer un RedirectResult personalizado, pero antes de hacerlo, quiero entender por qué el framework no lo permite en primer lugar. Debe haber una buena razón y tal vez yo tampoco debería hacerlo.

¿Conoce el motivo de esta limitación?

Gracias

Respuesta

32

existe la limitación debido MVC ya ha comenzado a prestar una vista al cliente. El efecto de redirigir desde este punto no está definido. Podría funcionar perfectamente, podría continuar renderizando la vista original sin redirigir, podría lanzar una excepción diferente, etc.

Como el resultado de realizar esta acción no está definido, el marco lo bloquea. En la práctica, RenderAction nunca debe usarse para representar otra cosa que no sea una vista (o contenido similar a una vista) por razones similares.

En su caso particular, la acción exterior debería redirigirse. Si va a terminar redirigiendo desde la vista de todos modos sin mostrarle nada al usuario, entonces realmente no tenía sentido pasar por la vista, ya que la acción externa podría haber delegado el trabajo apropiadamente en su propio.

1

En ese caso, simplemente apunte la URL de envío del formulario de vista parcial a la acción que fue el objetivo de su redirección problemática y permita que se redireccione a su versión GET.

6

En mi caso, el formulario que se muestra es un panel "configurar" en una extensión de un sitio web que estoy construyendo. Me gustaría que el propio controlador de la extensión pueda manejar el procesamiento del formulario y luego redireccionar a la página de administración que enumera todas las extensiones configuradas. No creo que sea apropiado o práctico solicitarle al controlador de la página principal que procese el formulario de la extensión. ¿Qué sugieres que haga en su lugar?

+0

Ese es el mismo escenario que tengo. Como solo lo uso en las páginas de administración para la extensibilidad, decidí mantener el redireccionamiento en el controlador de acción hijo. Escribí mi propio ChildActionRedirectResult y luego hice una base ChildActionController que anula los métodos de Redirect para usar mi propio resultado. No haría esto para el uso del front-end. – Sruly

+0

Terminé simplemente devolviendo un resultado de vista simple con un mensaje "Sus cambios fueron guardados" y un enlace a la página de administración para administrar extensiones. No es tan bonito, pero funcionó. –

3

A veces, este error se produce cuando intenta reproducir una acción de resultado de acción base. Ejemplo:

ActionResult X 
    Return View 
View X 
    RenderAction Y 

ActionResult Y 
    // Bla bla 
     return View 
    // else 
     return RedirectToAction X 
12

Mi solución.

método de acción:

return View("Redirect", model); 

Vista:

<script type="text/javascript" language="javascript"> 
    document.location = '<%: Url.Action("Index", "Album", new { id = Model.Id }) %>';</script> 
17

intenta utilizar algo como esto en Acción Infantil:

ControllerContext.HttpContext.Response.Redirect(ControllerContext.HttpContext.Request.Url.ToString()); 
+1

Lo usé en una acción de inicio de sesión que se muestra como vista parcial de la página principal que necesita redireccionar al iniciar sesión exitosamente – user1760527

+0

Esto ocasiona que el navegador cliente vuelva a solicitar la página después de recibir el encabezado de redirección, pero funciona lo suficientemente bien. –

5

En mi caso inusual, que tenía una costumbre AuthorizeAttribute adjunto a mis controladores que estaba intentando redirigir en una acción infantil, que es (como se mencionó anteriormente) no allo mie.

Para resolver el problema, quité comprobación de autorización de redirección de todas las acciones del niño:

Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext) 
    //Child actions cannot redirect anyway, so no need to check permissions. 
    If filterContext.IsChildAction Then Exit Sub 

    .. parent authorisation checks .. 
Cuestiones relacionadas