我才意識到我完全沒有回答這個問題,所以我加入到頂部這裏,並在下方留下我的老回答:
的問題是在一個iFrame發佈的文件時,該「X-Requested-With」標題未設置,您無法爲Javascript中的常規表單POST設置特定的請求標頭。您必須訴諸其他技巧,例如發送包含值的POST的隱藏字段,然後更改或覆蓋「IsAjaxRequest」擴展方法以檢查此情況。 How to override an existing extension method?
也許是最好的選擇很可能會包括您自己的擴展方法有不同的名稱,基於了與修改默認的MVC擴展方法的代碼來檢測你的iFrame上傳帖子,然後任何地方使用您的擴展方法你期望需要它。
jQuery默認將'X-Requested-With'標頭設置爲'XMLHttpRequest'。只要您小心地通過jQuery執行所有AJAX調用,它就非常有用。
根據您的需求,可以很容易地安裝在動作過濾器檢測到使用需要的地方,甚至建立它變成一個控制器類,像這樣:
[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;
}
}
}
}
並採用實現:
public class SomeController : MyController
{
public ActionResult Index()
{
if (IsAjaxRequest)
DoThis();
else
DoThat();
return View();
}
}
來源
2009-11-05 18:58:20
Jay
在你的代碼,IsAjaxRequest總是如此,擊敗了代碼的目的....再加上這是與擴展方法中存在的相同的功能......所以這真的不能幫助你。 – zowens 2009-11-06 00:32:58
感謝您的信息。在您領導之後,我最終通過JQuery動態添加了一個隱藏表單值(「isFileUploadAjaxPost」)。在控制器中,我檢查該表單變量。如果它存在,我使用TempData存儲此值,然後調用RedirectToAction以顯示新上載文件的「編輯」視圖。在接收動作方法中,我檢查Request.IsAjaxRequest()(正如我一直在做的一樣)以及我的TempData值,以確定請求是否爲「ajax」。很棒。謝謝! – goombaloon 2009-11-06 03:49:40
@zowens:我現在修復了這些代碼,但是,是的,我在實現它之後才意識到,然後查看完全相同的IsAjaxRequest擴展方法。我調整了ActionFilter中的代碼,該代碼根據請求類型動態設置母版頁,當然這比上面的代碼少一些冗餘。 – Jay 2009-11-06 07:16:44