2012-06-24 16 views
5

Ciao sto imparando Ajax + MVC. Ho pensato che sarebbe stato carino per il Controller gestire automaticamente reindirizzamenti ajax-aware(). Dopo alcuni scavi, ho trovato il codice da questo link. Il codice sotto è completamente trasparente per l'utente, un utente può semplicemente chiamare Redirect (someUrlString) senza doversi preoccupare della differenza tra le chiamate normali/ajax. Lo rende molto pulito e fresco.Controller di estensione MVC con funzionalità di reindirizzamento ajax-aware

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

e ...

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); } 
    } 
} 

Tuttavia, non è completa. Challenge è:

RedirectToRouteResultRedirectToAction (ActionResult risultato)

non c'è ancora (molto utile soprattutto per T4MVC).

Come io sono ancora nuovo per MVC, ho provato, ma non sono abbastanza esperto per capire sufficientemente il modo di scrivere questo me stesso. Qualcuno di voi esperti può aiutarmi con questo? quindi posso imparare dal tuo codice? Grazie mille.

risposta

6

Ecco la soluzione semplice rapida che uso per l'Ajax reindirizzamento a conoscenza nel mio progetto ..

  1. Creare un'AjaxRedirectAttribute classe per azione.

    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. utente questo attributo, come di seguito a uno reindirizzare a un'altra pagina o per tornare qualche risultato dall'azione.

    [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

Questa è una buona soluzione che lavorano con MVC gestione per l'Ajax eccezione (Ajax.BeginForm o jquery.ajax) chiamata.

Quindi, come sapete c'è un Application_Error nel file global.asax.cs. Puoi farmi sapere come gestire la chiamata ajax qui con il risultato "JavaScriptResult".

Sto usando "RedirectToRoute" per gestire la cosa, ma in alcuni di codice IT è aggiungendo il codice html con l'intestazione esistente. Il mio controller degli errori non ha layout (_Layout = null), ma mostra ancora intestazione e piè di pagina.

Sto solo lavorando a una nuova chiamata 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"}); 
      } 
     } 

Grazie

Sagar

Problemi correlati