2013-02-15 52 views
9

在ASP.NET MVC 2,在TempDataDictionary條目的壽命只是一個HTTP請求。TempData的實施變化 - 變化的原因

即轉換爲在一個請求中設置的值,重新定向,並具有在所述線的另一端訪問相同的項目。在此之後,無論您是否從字典的最後一行讀取該值,該條目都將不再可用。

因爲ASP.NET MVC 3(我相信),該實施細節都相當顯著改變。

條目在TempDataDictionary一旦被讀取的現在只能去除。

MVC 4

public object this[string key] 
    { 
     get 
     { 
     object obj; 
     if (!this.TryGetValue(key, out obj)) 
      return (object) null; 
     this._initialKeys.Remove(key); 
     return obj; 
     } 
    } 

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

MVC 2:

public object this[string key] { 
      get { 
       object value; 
       if (TryGetValue(key, out value)) { 
        return value; 
       } 
       return null; 
      } 

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

由於大多數人似乎都在一個請求中將項目放在TempData集合中,並立即在接下來的請求中將其讀回,所以功能看起來完全相同。

在場景中不是這種情況下,如想如果重定向到一個地方閱讀TempData項,預計如果請求的其他資源也已被刪除和導航回來,這種變化具有相當的影響。

不再是一個HTTP請求提供的條目,但可以在很多的HTTP請求,無論是隻適用於一個單一得到的字典。

我想更多地瞭解這個執行力度的變化,什麼是對變化的原因,是這僅僅是爲了滿足多重定向,還是有更深層次的好處?

除此之外,我很想知道是否有內置的東西可以滿足單個HTTP請求共享數據的需求,這與TempData用於滿足的方式相同?

+0

爲什麼不將MVC2'TempData'複製到您自己的實現中? – 2013-02-17 20:29:15

+0

我們基本上有。 – 2013-02-18 08:34:31

回答

6

你是正確的,如果他們已經被讀取(或用戶的會話過期之後),但是這一直以來MVC2的情況下TempData密鑰只被清除,(http://forums.asp.net/post/3692286.aspx

我想要知道更多關於這種改變,改變的原因是什麼,這只是爲了迎合多個 重定向還是有更深層的好處?

此更改防止了MVC 1中出現的問題,例如TempData密鑰在被讀取前被刪除。所以是的,主要好處是在您有多個重定向或交錯請求時避免這些問題。此外,RedirectToRouteResultRedirectResult方法現在會自動調用TempData.Keep()以防止清除密鑰,即使它們已被讀取,因此請牢記這一點。

在場景中不是這種情況下,如想如果重定向到一個地方閱讀 TempData的條目,並期待它有 被刪除,如果請求其他資源和導航回來,這 變化有相當一種影響。

你是對的,如果你在TempData鍵被自動清除的假設下編碼,你可能會遇到意想不到的問題。您可以撥打TempData.Clear()手動刪除TempDataDictionaryTempData.Remove(key)中的所有密鑰以刪除特定密鑰。您還可以使用TempData.Peek()來讀取TempData密鑰的值,而無需將其標記爲從TempDataDictionary中刪除。

次於,我好奇知道如果有什麼事,建於 ,現在在同樣的 方式TempData的用於滿足迎合了數據的單個HTTP請求共享?

我不知道任何複製TempData原始實現的新對象或函數。基本上我們仍然使用TempData,但必須注意數據一直持續到讀取並在需要時手動清除字典。

+0

謝謝傑克。很有幫助。 – 2013-02-20 15:45:45