2013-02-14 89 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问题有一个由蒂姆斯科特与更多信息链接的答案。