Tôi chỉ nhận ra mình hoàn toàn không trả lời câu hỏi, vì vậy tôi thêm vào phía trên đây, và để lại câu trả lời cũ của tôi dưới đây:
Vấn đề là khi đăng một tập tin trên một iFrame, các Tiêu đề "X-Requested-With" không được đặt và bạn không thể đặt tiêu đề yêu cầu cụ thể cho biểu mẫu POST thông thường trong Javascript. Bạn sẽ phải sử dụng các thủ thuật khác, như gửi một trường ẩn với POST của bạn có chứa một giá trị, sau đó thay đổi hoặc ghi đè phương thức mở rộng "IsAjaxRequest" để kiểm tra điều kiện này. How to override an existing extension method?
Có lẽ lựa chọn tốt nhất có lẽ sẽ là bao gồm phương pháp của riêng mở rộng với một cái tên khác, dựa tắt mặc định MVC phương pháp mã mở rộng với những thay đổi để phát hiện iFrame của bạn tải lên POST, và sau đó sử dụng phương pháp mở rộng của bạn bất cứ nơi nào bạn mong muốn cần nó.
jQuery thực sự đặt 'X-yêu cầu-Với' tiêu đề để 'XMLHttpRequest' theo mặc định. Nó là khá hữu ích miễn là bạn cẩn thận để làm tất cả các cuộc gọi AJAX của bạn trên jQuery.
Tùy thuộc vào nhu cầu của bạn, thật dễ dàng để thiết lập việc phát hiện trong một bộ lọc hành động để sử dụng nó khi cần thiết, hoặc thậm chí xây dựng nó thành một lớp điều khiển như vậy:
[jQueryPartial]
public abstract class MyController : Controller
{
public bool IsAjaxRequest { get; set; }
}
Các 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;
}
}
}
}
Và bằng cách sử dụng thực hiện:
public class SomeController : MyController
{
public ActionResult Index()
{
if (IsAjaxRequest)
DoThis();
else
DoThat();
return View();
}
}
Trong mã của bạn , IsAjaxRequest luôn đúng, đánh bại mục đích của mã .... cộng với đó là chức năng tương tự tồn tại trong phương thức mở rộng ... để thực sự không giúp bạn. – zowens
Cảm ơn thông tin. Theo sau khách hàng tiềm năng của bạn, tôi đã tự động thêm giá trị biểu mẫu ẩn ("isFileUploadAjaxPost") qua JQuery. Trong bộ điều khiển, tôi kiểm tra biến dạng đó. Nếu nó hiện diện, tôi sử dụng TempData để lưu trữ giá trị này trước khi gọi RedirectToAction để hiển thị chế độ xem "chỉnh sửa" cho tệp mới được tải lên. Trong phương thức nhận hành động, tôi kiểm tra cả hai Request.IsAjaxRequest() (như tôi đã làm tất cả cùng) cũng như giá trị TempData của tôi để xác định xem yêu cầu có phải là "ajax" hay không. Hoạt động tuyệt vời. Cảm ơn! – goombaloon
@zowens: Tôi đã sửa mã ngay bây giờ, nhưng có, tôi nhận ra sau khi thực hiện và sau đó xem xét phương pháp mở rộng IsAjaxRequest giống hệt nhau. Tôi đã điều chỉnh mã từ một ActionFilter tự động đặt trang cái dựa trên kiểu yêu cầu mà tất nhiên là phần nào ít dư thừa hơn so với mã trên. – Jay