2012-06-24 18 views
5

Hola, estoy aprendiendo Ajax + MVC. Pensé que sería bueno para el controlador manejar automáticamente un Redirect() consciente de javascript. Después de algunas excavaciones, encontré el código de este link. El código a continuación es totalmente transparente para el usuario, un usuario puede simplemente llamar a Redirect (someUrlString) sin tener que preocuparse por la diferencia entre las llamadas normales/ajax. Lo hace muy limpio y fresco.Controlador de extensión MVC para tener funcionalidad de redireccionamiento ajax

public abstract class BaseController : System.Web.Mvc.Controller { 
    //turn into ajax aware redirect 
    protected override RedirectResult Redirect(string url) { 
     return new AjaxAwareRedirectResult(url); 
    } 
} 

y ...

public class AjaxAwareRedirectResult : RedirectResult { 
    public AjaxAwareRedirectResult(string url) : base(url) { } 
    public override void ExecuteResult(ControllerContext context) { 
     if (context.RequestContext.HttpContext.Request.IsAjaxRequest()) { 
      string desturl = UrlHelper.GenerateContentUrl(Url, context.HttpContext); 
      JavaScriptResult result = new JavaScriptResult() { 
             Script = "window.location='" + desturl + "';" }; 
      result.ExecuteResult(context); 
     } 
     else { base.ExecuteResult(context); } 
    } 
} 

Sin embargo, no es completa. Reto es:

RedirectToRouteResultRedirectToAction (ActionResult resultado)

no está allí todavía (muy útil sobre todo para T4MVC).

Como soy nuevo en MVC, lo intenté, pero no estoy lo suficientemente enterado como para descubrir cómo escribir esto yo mismo. ¿Podrían alguno de ustedes expertos ayudarme con esto? entonces puedo aprenderlo de tu código? Muchas gracias.

Respuesta

6

Aquí es la solución simple rápida utilizo para Ajax redirección conscientes en mi proyecto ..

  1. Crear una AjaxRedirectAttribute clase de acción.

    public class AjaxRedirectAttribute : ActionFilterAttribute 
        { 
         public override void OnActionExecuted(ActionExecutedContext filterContext) 
         { 
          var result = filterContext.Result as RedirectResult; 
          if (result != null && filterContext.HttpContext.Request.IsAjaxRequest()) 
          { 
           string destinationUrl = UrlHelper.GenerateContentUrl(result.Url, filterContext.HttpContext); 
           filterContext.Result = new JavaScriptResult() 
           { 
            Script = "window.location = '" + destinationUrl + "';" 
           }; 
          } 
         } 
        } 
    
  2. usuario este atributo como a continuación o bien redirigir a otra página o volver algún resultado de la acción.

    [AjaxRedirect] 
    public ActionResult MyAction(FormCollection frmcol) 
    { 
        // some code here 
        if (UserId != 0) 
        { 
         return Redirect(this.Url.Action("Action", "Controller")); 
        } 
        else 
        { 
         return Content("Error message here."); 
        } 
    } 
    
0

Ésta es una buena solución que funciona con MVC manejo para el Ajax excepción (Ajax.BeginForm o jquery.ajax) llamada.

Así que, como saben, hay un Application_Error en el archivo global.asax.cs. ¿Puede decirme cómo manejar la llamada ajax aquí con el resultado "JavaScriptResult"?

Estoy usando "RedirectToRoute" para manejarlo, pero en algunos de los códigos se agrega el html con el encabezado existente. Mi controlador de error no tiene diseño (_Layout = null), pero aún muestra el encabezado y el pie de página.

Estoy trabajando para una nueva llamada de RedirectToRoute.

Response.RedirectToRoute("Default", new {controller = "Error", action = "Error"}); 



protected void Application_Error(object sender, EventArgs e) 
     { 
      RouteValueDictionary routeDataCollection = HttpContext.Current.Request.RequestContext.RouteData.Values; 
      if (null != routeDataCollection && routeDataCollection.Count()>1) 
      { 
       Server.ClearError(); 
       Response.RedirectToRoute("Default", new { controller = "Error", action = "Error"}); 
      } 
     } 

Gracias

Sagar

Cuestiones relacionadas