2013-02-14 91 views
4

我有一個jQuery $ .post回到MVC 4控制器,它將使用POST中發送的數據進行渲染並返回一個PartialViewResult。調試部分視圖和控制器時,正在接收正確的數據並將其作爲視圖模型發送到部分視圖。問題是,在分析AJAX結果中發回的HTML時,它包含了原始頁面刷新中看似「緩存」的數據。

我在這裏看到很多帖子都是類似的,但沒有一個與我的問題相同。

我知道HTTP POST請求不會在瀏覽器中緩存,所以這不是問題。我還設置了設置的OutputCache屬性NoStore =真等

控制器

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 
public partial class MyController : Controller 
{ 
    ... 
    [HttpPost] 
    public virtual ActionResult UpdatePartial(MyViewModel myVm) 
    { 
     return this.PartialView("My/_Partial", myVm); 
    } 
} 

JS

$('.someButton').click(function() { 
     $.post(myAjaxUrl, $('form').serialize(), function (data) { 
      $('#myContent').html(data); 
     }); 
    }); 
+0

使用Fiddler來捕獲響應並將響應正文與瀏覽器中的ajax響應進行比較。 – Corneliu 2013-02-14 15:36:44

+0

@Corneliu謝謝,他們是一樣的。 – 2013-02-14 15:41:47

+0

爲你的ajax url添加一個高速緩衝存儲器參數。雖然POSTs被認爲沒有被緩存,但在某些情況下我看到它發生了。 – BNL 2013-02-14 15:50:23

回答

0

默認情況下,jQuery將緩存$阿賈克斯的XMLHttpRequest(除非數據類型是腳本或jsonp)。由於$ .post是通過$ .ajax實現的,JQuery本身緩存了你的請求。下面的JS應該可以工作。

JS

$('.someButton').click(function() { 
    $.ajax{(
     url: myAjaxUrl, 
     data: myAjaxUrl, 
     success: function (data) { 
      $('#myContent').html(data); 
     }, 
     cache: false 
    }); 
}); 

您可能還會發現它值得在處理的情況下錯誤事件後不會成功。

+2

'默認情況下,JQuery將緩存$ .ajax XMLHttpRequests'。這不是真的。瀏覽器只緩存GET請求。 POST請求(這是$ .post正在使用的內容)永遠不會被緩存。 – 2013-02-16 15:48:35

+0

@DarinDimitrov如何強制執行'$。post'來緩存HTTPPOST行爲?我已經使用'OutputCache'屬性來修飾jquery中的動作結果和'cache:true',但我仍然無法將其緩存。 – 2016-10-24 07:43:23

2

在對模型進行任何操作之前,我可以通過添加ModelState.Clear來解決此問題。

[HttpPost] 
public virtual ActionResult UpdatePartial(PersonViewModel model) 
{ 
    ModelState.Clear(); 
    model.FirstName += "1"; 
    model.LastName += "1"; 
    model.Age += 1; 
    return this.PartialView("../My/_Partial", model); 
} 

This問題有一個由蒂姆斯科特與更多信息鏈接的答案。