我遇到了部分视图被缓存的问题,我不想这样做。我用谷歌搜索了这个,有几种方法可以解决这个问题,但这些方法似乎都不适用于我。
基本上我在服务器上有一个返回局部视图的动作。我首先在页面加载时从Html.RenderPartial调用它。然后所有其他调用都来自同一页面上的jQuery,当点击链接时,然后刷新部分视图所在的页面部分。每个按下的链接发送不同的数据,因此第一次点击每个链接它调用teh服务器,但每次后续点击都是从缓存副本中呈现的。
在我的_Layout页面(我的母版页)上,我在顶部有以下内容:
<script type="text/javascript">
$.ajaxSetup({
cache: false
});
</script>
每个ajax调用都禁用缓存,如下所示:
$.ajax({
url: UrlToGetEmployeeGrid,
type: 'GET',
cache: 'false',
success: function (response) {
$EmployeeGridObject.html(response);
},
error: function (xhr) {
alert('There was an error contacting the server to refresh the employee grid');
}
});
呼叫永远不会到达服务器。但我也尝试在控制器操作中添加(以防万一)以下内容:
[HttpGet]
[OutputCache(Duration = 0)]
但这给了我一个错误:
System.InvalidOperationException: Duration must be a positive number.
我也尝试过:
[HttpGet]
[OutputCache(Duration = 0, VaryByParam="none")]
并得到了同样的错误。
我有什么想法可以停止从ajax调用到正确的操作吗?
更新:
根据Paulo的评论,这在Chrome中运行良好,但在IE中不起作用。我添加了一个随机数来解决这个问题。但是,从长远来看,我需要一个更好的解决方案,因为有些情况下我需要缓存一段时间的操作,IE需要能够做到。
答案 0 :(得分:3)
我设置了NoStore属性并将VaryByParam更改为“*”。
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
答案 1 :(得分:3)
您可以像这样创建自己的NoCacheAttribute:
public class NoCacheAttribute : FilterAttribute, IActionFilter
{
#region IActionFilter Members
public void OnActionExecuted(ActionExecutedContext filterContext)
{
return;
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.SetNoStore();
}
#endregion
}
您可以将其应用于您的行动:
[HttpGet]
[NoCache]
应该解决你的问题(我现在使用这个解决方案很长时间了。)
答案 2 :(得分:1)
编辑:这是可行的
将Guid作为随机字符串附加肯定会绕过这个明显的IE错误(并且是真正随机的)。例如将r=Guid.NewGuid().ToString()
附加到查询字符串或类似字符串。
在你的情况下(使用javascript)它有点复杂并且在javascript中生成UUID的复杂性是众所周知的,但可以这样做:
见这里:https://github.com/broofa/node-uuid然后可能在这里:https://gist.github.com/982883这个宝石:
function b(a){return a?(a^Math.random()*16>>a/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,b)}
底线:尝试使用此单行javascript函数生成随机字符串以附加到查询字符串以防止缓存:http://jsfiddle.net/Dommer/yQWht/