2009-10-19 9 views
7

Uso ajaxForm con jQuery e c'è un problema con Firefox: per qualche motivo non conserva l'intestazione personalizzata X-Requested-With (che viene utilizzata per rilevare IsAjaxRequest()). Ciò porta all'azione del mio controller che restituisce la vista completa anziché quella parziale poiché IsAjasxRequest() restituisce false dopo il reindirizzamento.Firefox non conserva intestazioni personalizzate durante il reindirizzamento della richiesta Ajax: una soluzione MVC ASP.NET

Questo errore si verifica solo in Firefox, funziona bene in Chrome, ad esempio.

È possibile vedere questo errore menzionato here. Un post piuttosto vecchio quindi mi chiedo perché mi capita ancora (io uso Firefox 3.5.3). Ad ogni modo, ecco la soluzione che ho inventato - nella mia classe di controller di base:

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
    var ajaxRequestBeforeRedirect = TempData["__isajaxrequest"] as string; 
    if (ajaxRequestBeforeRedirect != null) 
     Request.Headers.Add("X-Requested-With", ajaxRequestBeforeRedirect); 
    } 

    private bool IsRedirectResult(ActionResult result) 
    { 
    return result.GetType().Name.ToLower().Contains("redirect"); 
    } 

    protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
    base.OnActionExecuted(filterContext); 
    if (IsRedirectResult(filterContext.Result) && Request.Headers["X-Requested-With"] != null) 
     TempData["__isajaxrequest"] = Request.Headers["X-Requested-With"]; 
    } 

Funziona; tuttavia, ho due domande qui:

  1. Questo errore non è stato risolto in Firefox o non ho capito qualcosa?
  2. È una buona soluzione? C'è qualcosa di meglio? Non posso credere che nessuno abbia avuto questo problema prima.

AGGIORNAMENTO: per coloro che sono interessati a questo problema, Request.Headers.Add ha problemi con IIS6 (o forse IIS5, ma comunque). Quindi il modo corretto sarebbe di memorizzare questo flag "isAjaxRequest" in TempData/HttpContext.Items/base controller.

+0

A penso che questo sia un bug di Firefox troppo, e deve essere risolto. –

risposta

5

Solo nel caso qualcuno inciampa altro su questo argomento dopo chiedendo perché il loro invio header-base non riesce in Firefox, questo non è fissata a partire dal 2010-10-11, testato in Firefox 3.6.10

https://bugzilla.mozilla.org/show_bug.cgi?id=553888 è la bug corrispondente, e dai commenti più recenti a partire da oggi (da Jonas, effettuate su 2010-09-16) questo problema verrà non essere fissata in Firefox 4.

Inoltre, questo bug sembra estendersi alle intestazioni impostabili normali come Accept, ovvero lo Accept: application/json scomparirà dopo un reindirizzamento e molto probabilmente il tuo motore xhr riceverà una risposta HTML.

Problemi correlati