2010-05-19 30 views
23

registros estoy ir a buscar para un usuario en base a su UserId como JsonResult ...Cómo redirigir a una acción de controlador desde un método JSONResult en ASP.NET MVC?

public JsonResult GetClients(int currentPage, int pageSize) 
{ 
    if (Session["UserId"] != "") 
    { 
     var clients = clirep.FindAllClients().AsQueryable(); 
     var count = clients.Count(); 
     var results = new PagedList<ClientBO>(clients, currentPage - 1, pageSize); 
     var genericResult = new { Count = count, Results = results }; 
     return Json(genericResult); 
    } 
    else 
    { 
     //return RedirectToAction("Index","Home"); 
    } 
} 

cómo redirigir a una acción de un controlador de un método JsonResult en asp.net mvc? Cualquier sugerencia ...

EDIT: esto no parece funcionar ...

if (Session["UserId"] != "") 
      { 
       var clients = clirep.FindAllClients().AsQueryable(); 
       var count = clients.Count(); 
       var results = new PagedList<ClientBO>(clients, currentPage - 1, pageSize); 
       var genericResult = new { Count = count, Results = results ,isRedirect=false}; 
       return Json(genericResult); 
      } 
      else 
      { 
       return Json({redirectUrl = Url.Action("Index", "Home"), isRedirect = true }); 
      } 

Respuesta

53

Esto dependerá de la forma en que está invocando esta acción del controlador. Como está utilizando JSON, supongo que lo está llamando en AJAX. Si este es el caso, no puede redirigir desde la acción del controlador. Tendrá que hacer esto en la devolución de llamada success del script AJAX. Una forma de lograrlo es la siguiente:

return Json(new 
{ 
    redirectUrl = Url.Action("Index", "Home"), 
    isRedirect = true 
}); 

Y en la devolución de llamada de éxito:

success: function(json) { 
    if (json.isRedirect) { 
     window.location.href = json.redirectUrl; 
    } 
} 

Observación: Asegúrese de incluir isRedirect = false en el JSON en caso de que no quiere volver a dirigir la cual es el primer caso en su acción de controlador.

+0

estoy usando jQuery.ajax() ... –

+1

'redirectUrl' no existe en el contexto actual ... –

+0

Redirecciono con AJAX todo el tiempo, pero cuando uso colecciones de campos de formularios publicados, no cuando uso JSON. De hecho, estoy intentando rastrear un error que implica una redirección con datos publicados por JSON en este momento: http://stackoverflow.com/questions/4110889/asp-net-mvc-2-losing-authorization-when-redirecttoaction- with-json-data Parece que esto no es algo que pueda hacer entonces, ¿sí? – kdawg

0

no hay manera de hacer esto, el cliente está ejecutando un script de AJAX por lo que no será capaz de t o manejar cualquier otra cosa.

Sugiero que redirija en el script del cliente en función de los datos devueltos en la función de devolución de llamada.

Tome un vistazo a una pregunta similar aquí: http://bytes.com/topic/javascript/answers/533023-ajax-redirect

2

Qué piensa usted acerca de tratar de llamar:

return (new YourOtherController()).JSONResultAction(); 

en lugar de utilizar redirecciones?

3

Añadiendo a la respuesta de Darin Dimitrov. Para C# .NET MVC: si desea redirigir a una página/controlador diferente y desea enviar un Objeto/Modelo al nuevo controlador, puede hacer algo como esto.

En el Método JsonResult (en el controlador):

ErrorModel e = new ErrorModel(); 
      e.ErrorTitle = "Error"; 
      e.ErrorHeading = "Oops ! Something went wrong."; 
      e.ErrorMessage = "Unable to open Something"; 



return Json(new 
{ 
    redirectUrl = Url.Action("Index", "Home",e), 
    isRedirect = true 
}); 

Y en la devolución de llamada de éxito:

success: function(json) { 
    if (json.isRedirect) { 
     window.location.href = json.redirectUrl; 
    } 
} 

Y si el nuevo controlador puede aceptar el modelo/objeto, como a continuación se .. puede pasar el objeto al nuevo controlador/página

public ActionResult Index(ErrorModel e) 
    { 
     return View(e); 
    } 

Espero que esto ayude.

1

Y si se trabaja con áreas ...

controlador:

return Json(new 
     { 
      redirectUrl = Url.Action("Index", "/DisparadorProgSaude/", new { area = "AreaComum" }), 
      isRedirect = true 
     }); 

Vista:

success: function (json) { 

          if (json.isRedirect) { 
          window.location.href = json.redirectUrl; 
          } 
         }, 
Cuestiones relacionadas