¿Por qué no se permiten los resultados de redirección en las acciones secundarias en Asp.net MVC 2?

Tengo algunas acciones parciales que realizo con el método Asp.Net Futures RenderAction. Algunos de estos realizan redireccionamientos una vez procesados ​​los formularios.

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.

¿Alguien sabe el motivo de esta limitación?

Gracias

La limitación existe porque MVC ya comenzó a mostrar una vista al cliente. El efecto de redirigir desde este punto no está definido. Podría funcionar perfectamente, podría continuar representando 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.

Intenta usar algo como esto en Acción infantil:

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

Mi solución.

Método de acción:

 return View("Redirect", model); 

Ver:

  

En mi caso, el formulario que se está presentando es un panel “configurar” en una extensión de un sitio web que estoy creando. 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?

En mi caso inusual, tenía un AuthorizeAttribute personalizado adjunto a mis controladores que intentaba redirigir en una acción secundaria, que (como se menciona anteriormente) no está permitida.

Para resolver el problema, eliminé la autorización de verificación de redirección en todas las acciones secundarias:

 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 .. 

A veces, este error se produce cuando intentas generar 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 

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