2015-01-07 51 views
0

在我的部分視圖中,我有一個對話框並呈現了一個奇特的樹。從列表框更改事件的視圖中加載樹。當樹被加載時,我檢查是否存在緩存,如果它從緩存中提取,如果不存在,則建立並將列表添加到緩存中。在ajax請求中返回舊結果的查詢

緩存本身工作正常,但將數據提取到要添加到緩存的列表的方法似乎會拉出較舊的值。由於此方法在此視圖上由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

我遇到過這樣的錯誤一次,這是一個緩存問題。爲了解決這個問題,每次我發送一個新的ajax請求,我附加了一個新的隨機數的URL。

希望這可以幫助你。

例如假設網址是:

http://localhost/app1/getData?id=randomNb 
+0

我傳遞的數據是這樣的數據:$( 「#形式」)序列化() – user721