2015-09-10 32 views
0

我以爲TempData在一次刷新或頁面重定向後應該變爲空。我的頁面需要刷新兩次才能清除數據,雖然這不是我想要的,但是如何在1次刷新/重定向之後將其清空?刷新後TempData不爲空

@using (Html.BeginForm()) 
{ 
    <div class="form-group"> 
     <button class="btn btn-default" type="submit">test</button> 
    </div> 
} 

public void test() 
{ 
    List<int> integers = new List<int>(); 
    integers.Add(10); 
    integers.Add(20); 

    //First Refresh and myList still has values when I want it to be null 
    List<int> myList = (List<int>)TempData["test"]; // Take the value from the current data variable 

    if (myList == null) // Not yet stored in session, create a new list and store it as a session variable 
    { 
     myList = new List<int>(); 
     TempData.Add("test", myList); 
    } 

    myList.AddRange(integers); // Add a new entry   
} 
+1

應該可用於未來* *請求 - 否則,它不會是非常有用的。 –

+0

好的。只有當動作再次是test()時,我將如何保存下一個請求的數據?並清除任何其他請求的數據。 –

+0

顯示你的動作代碼。 – Kamo

回答

3

我最近通過其源代碼去找出TempData的是如何工作的。

所以tempdata的壽命是相當不尋常的,因爲它只是一個請求。爲了實現這一點,保持2個HashSets來管理密鑰和數據字典:

private Dictionary<string, object> _data; 
private HashSet<string> _initialKeys = new HashSet<string>(StringComparer.OrdinalIgnoreCase); 
private HashSet<string> _retainedKeys = new HashSet<string>(StringComparer.OrdinalIgnoreCase); 

當您閱讀使用索引或TryGetValue方法的一些數據將刪除從_initalKeys集合關鍵。

public bool TryGetValue(string key, out object value) 
{ 
    _initialKeys.Remove(key); 
    return _data.TryGetValue(key, out value); 
} 

此時保存數據的實際字典完好無損。這就是爲什麼我們可以連續讀取相同的數據而沒有任何問題。它只從_initialKeys集合中刪除密鑰,基本上標記爲在數據持久時被刪除。

如果您希望TempData中的值持續更長時間,可以使用Peek和Keep方法。 Peek所做的是在不從_initialKeys中刪除它的情況下返回該值:

public object Peek(string key) 
{ 
    object value; 
    _data.TryGetValue(key, out value); 
    return value; 
} 

或者,您可以調用Keep方法。同樣,它不直接操作數據,但只是通過將其添加到集合中來標記要保留的鍵。

public void Keep(string key) 
{ 
    _retainedKeys.Add(key); 
} 

最後和它(默認情況下會議)通過調用提供的保存方法將數據保存:

public void Save(ControllerContext controllerContext, ITempDataProvider tempDataProvider) 
{ 
    _data.RemoveFromDictionary((KeyValuePair<string, object> entry, TempDataDictionary tempData) => 
     { 
      string key = entry.Key; 
      return !tempData._initialKeys.Contains(key) 
       && !tempData._retainedKeys.Contains(key); 
     }, this); 

    tempDataProvider.SaveTempData(controllerContext, _data); 
} 

所以只留在_initialKeys集合(讀)的數據,並且是那些特別指示保留(_retainedKeys集合中的鍵)將被保存。因此壽命!

參考:TempDataDictionary source code

-1

如果您希望在請求完成後保留TempData對象的值,則需要在當前操作中調用Keep方法。

tutorial