在我的局部视图中,我有一个对话框,呈现了一个奇特的树。从列表框更改事件的视图我加载树。加载树时,我检查是否存在缓存,是否存在缓存,如果没有,则构建并将列表添加到缓存中。
缓存本身工作正常,但是将数据提取到列表以添加到缓存的方法似乎会提取较旧的值。由于这个方法是由ajax在这个视图上触发的,我怀疑问题在于,我试图在控制器动作方法中设置无缓存属性以及发送硬代码缓存胸围参数但无济于事。
JS列表框更改事件
$('#SystemID').change(function () {
var userroleid = $("#UserRoleID").val();
// if (userroleid != 1) {
$("#treeview").remove();
$("#partTreeView").remove();
var overlay = $('<div></div>').prependTo('body').attr('id', 'overlay');
$.ajax({
type: 'POST',
url: serviceEntryURL,
cache: false,
datatype: "html",
data: $("#form").serialize(),
success: function (result) {
$("#main").html(result);
overlay.remove();
}
});
});
查看渲染树
<div id="errorCodes">
@Html.RenderTree(CacheHelper.ErrorCodes(@Model.ErrorCodeType), ec => ec.Name, ec => ec.Children.ToList(), ec => (ec.ID).ToString(), Model.ErrorCodes, "error")
</div>
缓存助手
if (HttpRuntime.Cache[cacheKeyRemove] != null)
{
ERRORCODES = (List<Domain.Lists.ErrorCode>)HttpRuntime.Cache[cacheKeyRemove];
}
else
{
** //以下方法GlobaList.ErrorCodes没有被缓存或者任何东西,但它仍然返回 旧的价值观。 **
ERRORCODES = RunLog.Domain.Lists.GlobalList.ErrorCodes(instrumentTypeID);
HttpRuntime.Cache.Add(cacheKeyRemove, ERRORCODES, null, DateTime.Now.AddHours(10), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
}
错误代码编辑页面
如果我转到此视图并编辑错误代码并成功删除缓存密钥。当我回到我渲染树的视图时,由于删除了这个缓存,它会查询上面的方法来构建错误代码列表,但我刚编辑的值不是正确的而是旧的。更奇怪的是,如果我在错误代码表中添加新记录并重置缓存,则新记录会在另一个视图中正确显示。
while (enumerator.MoveNext())
{
if (enumerator.Key.ToString() == cacheKeyRemove)
{
HttpContext.Cache.Remove(enumerator.Key.ToString());
}
}
答案 0 :(得分:0)
我曾经遇到过这样的错误,这是一个缓存问题。为了解决这个问题,每次我发送一个新的ajax请求时,我都会用一个新的随机数附加url。
希望这会对你有所帮助。
例如,假设网址为:http://localhost/app1/getData?id=randomNb