Używam ajaxForm z jQuery, a jest jeden problem z Firefoksem - z jakiegoś powodu nie zachowuje on niestandardowego nagłówka (który jest używany do wykrywania ). Powoduje to, że działanie kontrolera zwraca pełny widok zamiast częściowego, ponieważ IsAjasxRequest()
zwraca wartość false po przekierowaniu.Firefox nie zachowuje niestandardowych nagłówków podczas przekierowania żądania Ajax: rozwiązanie ASP.NET MVC
Ten błąd występuje tylko w przeglądarce Firefox, na przykład działa w Chrome.
Możesz zobaczyć ten błąd wymieniony here. Ładny stary post, więc zastanawiam się, dlaczego wciąż mi się to przydarza (używam Firefoksa 3.5.3). Tak czy inaczej, oto rozwiązanie wymyśliłem - w mojej klasie kontrolera podstawa:
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"];
}
Działa; jednak mam tu dwa pytania:
- Czy ten błąd nie został naprawiony w Firefoksie, czy coś nie rozumiem?
- Czy to dobre rozwiązanie? Czy jest coś lepszego? Nie mogę uwierzyć, że nikt wcześniej nie miał tego problemu.
AKTUALIZACJA: dla tych, którzy są zainteresowani tym problemem, Request.Headers.Add ma problemy z IIS6 (lub może IIS5, ale tak). Prawidłowy sposób przechowywania tej flagi "isAjaxRequest" w TempData/HttpContext.Items/base controller.
Uważa się, że jest to również błąd typu "firefox" i musi zostać naprawiony. –