Uso ajaxForm con jQuery, y hay un problema con Firefox: por alguna razón, no conserva el encabezado personalizado X-Requested-With
(que se usa para detectar IsAjaxRequest()
) Esto lleva a que mi acción de controlador devuelva vista completa en lugar de parcial ya que IsAjasxRequest()
devuelve falso después de redirigir.Firefox no conserva encabezados personalizados durante el redireccionamiento de solicitudes Ajax: una solución ASP.NET MVC
Este error solo ocurre en Firefox, funciona bien en Chrome, por ejemplo.
Puede ver este error mencionado here. Una publicación bastante antigua, así que me pregunto por qué todavía me sucede a mí (uso Firefox 3.5.3). De todos modos, aquí está la solución que inventé - en mi clase de controlador 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"];
}
Funciona; sin embargo, tengo dos preguntas aquí:
- ¿Este error no está solucionado en Firefox o no entiendo algo?
- ¿Es una buena solución? ¿Hay algo mejor? No puedo creer que nadie haya tenido este problema antes.
ACTUALIZACIÓN: para aquellos que estén interesados en este problema, Request.Headers.Add tiene problemas con IIS6 (o tal vez con IIS5, pero de todos modos). Entonces, la forma correcta sería almacenar esta bandera "isAjaxRequest" en TempData/HttpContext.Items/base controller.
Creo que esto también es un error de Firefox, y necesita ser reparado. –