2011-04-13 18 views
5

Así que vi this question aquí en SO, pero realmente no me ha solucionado este problema.ASP.NET MVC 3 + Razor Error: las acciones secundarias no pueden realizar acciones de redirección

Tengo una aplicación ASP.NET MVC 3 + Razor ejecutándose en IIS5 en mi pc dev y luego IIS6 para mi servidor web dev. Todo funcionó de maravilla hasta que lo implementé. Estoy desplegando todo, sin problemas en ese frente (que puedo decir).

Ahora recibo este Las acciones secundarias no pueden realizar acciones de redirección error en mi página. No estoy seguro de cómo señalar dónde está fallando.

estoy usando @ Html.Action para tirar en algunos cuadros desplegables con los datos:

public ActionResult Hierarchy() 
    { 
     List<Store> storeList = DBService.getStores();    
     if (DBService.Error != null) 
      return RedirectToError(DBService.Error); 

     List<Department> deptList = DBService.getDepts(); 
     if (DBService.Error != null) 
      return RedirectToError(DBService.Error); 

     VM_Hierarchy hierarchy = new VM_Hierarchy(storeList, deptList); 

     return View(hierarchy); 
    } 

Si quito la línea @ Html.Action, la página se rinda. A continuación, se rompen si hago una petición AJAX a una acción de controlador como este:

[HttpPost] 
    public ActionResult InventoryList(string fromDate, string toDate) 
    { 
     List<Inventory> inventories = DBService.getInventories(fromDate, toDate); 

     if (DBService.Error != null) 
      return RedirectToAction("Error"); 

     return View(inventories); 
    } 

Si esto no es correcto, ¿cómo se supone para redirigir a una página de error o dictar lo que la vista es retornada en una ¿enviar? Cualquier ayuda es apreciada. Gracias.

Respuesta

7

Probablemente sea porque está obteniendo errores de su servicio de base de datos cuando está implementado, lo que no está obteniendo localmente. Esto hace que intente redirigir desde una acción secundaria, lo que no puede hacer.

Es posible que desee intentar obtener los datos desplegables en su acción principal, y ponerlo todo en un modelo de vista, por lo que no está utilizando acciones secundarias. Si esto falla, puede redireccionar al contenido de su corazón. Para AJAX, tendrá que manejar los errores en el cliente y hacer algo sensato, no puede simplemente devolver una redirección de una llamada AJAX.

Esta pregunta tiene algo más Info: Why are Redirect Results not allowed in Child Actions in Asp.net MVC 2

+0

Entonces, ¿es incorrecto asumir que la redirección ocurre en el servidor y solo está enviando el nuevo HTML de la página? No quiero redireccionar la página, solo ejecutar una acción diferente y enviar una vista diferente. – IronicMuffin

+0

Bueno, la redirección de los controladores está en el servidor, el problema es que está redirigiendo desde una acción secundaria o llamada AJAX; en ambos casos, parte de una página ya existe y no puede hacer una redirección en el servidor. medio de una página. –

+0

Supongo que no sigo. Me imagino que estoy obteniendo el HTML de la vista original o el HTML de una nueva vista para renderizar en la página. No veo dónde está el problema. ¿Supongo que enviaré javascript para los parciales?¿Cómo se elige cuál parcial cargar según lo que ocurre en el lado del servidor? – IronicMuffin

1

que tenía un problema similar, pero para la vida de mí, no pude averiguar dónde está el cambio de dirección venía. Una vez que lo descubrí, pensé en publicar una respuesta en caso de que le ocurriera a alguien más.

Si la fuente de la redirección no es evidente a partir del código imperativo, por ejemplo .:

[AuthoriseThis] 
    public ActionResult Details(SomethingModel something) 
    { 
     return PartialView(something); 
    } 

mirar el código declarativa!

En mi caso, era un problema de autorización, por lo que el atributo estaba causando la redirección, y mis ojos estaban filtrando la existencia del atributo.

2

si se pone en la acción del niño (ControllerContext.ParentActionViewContext.Controller as System.Web.Mvc.Controller).Response.Redirect(Url.Action("Action", "Controller")); volverá a dirigir desde el childaction.

Cuestiones relacionadas