Właśnie uświadomiłem sobie, że całkowicie nie odpowiedział na pytanie, więc dodaję do góry tutaj, pozostawiając moją starą odpowiedź poniżej:
problem jest podczas wysyłania pliku na iFrame, Nagłówek "X-Requested-With" nie jest ustawiony i nie możesz ustawić konkretnych nagłówków żądań dla zwykłego formularza POST w JavaScript. Będziesz musiał uciekać się do innych sztuczek, takich jak wysyłanie ukrytego pola z POST, który zawiera wartość, a następnie zmienić lub przesłonić metodę rozszerzenia "IsAjaxRequest", aby również sprawdzić ten warunek. How to override an existing extension method?
Prawdopodobnie najlepszym rozwiązaniem byłoby prawdopodobnie zawierać własną metodę rozszerzenia z inną nazwą, w oparciu off domyślnego MVC kodu metodę rozszerzenia ze zmianami wykryć iFrame przesłać POST, a następnie użyć metody rozszerzenie wszędzie tam, gdzie oczekujesz tego.
jQuery ustawia domyślnie nagłówek "X-Requested-With" na "XMLHttpRequest". Jest to bardzo przydatne, o ile jesteś ostrożny przy wykonywaniu wszystkich wywołań AJAX przez jQuery.
W zależności od potrzeb, można łatwo skonfigurować wykrywanie w filtrze działania z niego korzystać w razie potrzeby, a nawet zbudować go w klasie kontrolera tak:
[jQueryPartial]
public abstract class MyController : Controller
{
public bool IsAjaxRequest { get; set; }
}
ActionFilterAttribute:
public class jQueryPartial : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Verify if a XMLHttpRequest is fired.
// This can be done by checking the X-Requested-With
// HTTP header.
MyController myController = filterContext.Controller as MyController;
if (myController != null)
{
if (filterContext.HttpContext.Request.Headers["X-Requested-With"] != null
&& filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
{
myController.IsAjaxRequest = true;
}
else
{
myController.IsAjaxRequest = false;
}
}
}
}
i korzystania realizację:
public class SomeController : MyController
{
public ActionResult Index()
{
if (IsAjaxRequest)
DoThis();
else
DoThat();
return View();
}
}
W twoim kodzie , IsAjaxRequest jest zawsze prawdziwy, pokonując cel kodu .... plus to ta sama funkcjonalność, która istnieje w metodzie rozszerzenia ... tak więc to naprawdę nie pomaga. – zowens
Dzięki za informacje. Podążając za twoim przykładem, zakończyłem dynamicznie dodając ukrytą wartość formularza ("isFileUploadAjaxPost") przez JQuery. W kontrolerze sprawdzam tę zmienną formularza. Jeśli jest obecny, używam TempData do przechowywania tej wartości przed wywołaniem RedirectToAction, aby wyświetlić widok "edycji" dla nowo przesłanego pliku. W metodzie działania receive sprawdzam zarówno Request.IsAjaxRequest() (tak jak robiłem cały czas), jak i moją wartość TempData, aby określić, czy żądanie jest "ajax" czy nie. Działa świetnie. Dzięki! – goombaloon
@zowens: Naprawiłem kod teraz, ale tak, zdałem sobie sprawę po jego wykonaniu, a następnie patrząc na metodę rozszerzenia IsAjaxRequest, która jest dokładnie taka sama. Zaadaptowałem kod z ActionFilter, który dynamicznie ustawia stronę wzorcową na podstawie typu żądania, co oczywiście jest nieco mniej redundantne niż powyższy kod. – Jay