2009-06-03 54 views
4

我試圖找到一個很好的方法來處理以下情形(我還是有點新本):ASP.NET MVC:如何處理跨動作的TempData和ViewData的

用戶可以註冊通過我的網站使用RPX/OpenId提供商。

步驟1:用戶通過提供商進行身份驗證。提供者將一個臨時令牌返回給我的一個操作方法。

第2步:我使用令牌來抓取用戶的個人資料信息並加載一個視圖,允許他們輸入任何缺少的必填字段和可選字段。

我在步驟2中使用了兩個操作方法:一個用來處理使用令牌獲取信息。第二個操作是獲取授權信息並加載缺失/可選字段視圖。

我通過TempData將授權信息傳遞給第二個操作。第二個動作可以處理驗證,因此我有可能需要堅持不止一個請求的授權對象。我不能使用該令牌重新生成授權信息,因爲它在技術上是一次性使用的令牌,並且由於使用網絡資源而重新生成請求將會很愚蠢。

如何將對象保存在我的TempData中,以便對相同動作的任何後續請求,但是刪除任何重定向的對象?而且,因爲這可能是我應用程序中的可重複模式,所以我應該創建一個Filter來自動處理這種情況?

例如,我想象一個過濾器屬性,它將合併TempData(如果有的話)到ViewData中 - 但是如何將我的數據保存到未來調用相同的動作?把它再次投入到TempData中?如果我檢測到重定向空的TempData?

感謝

回答

3

如果需要,我最終將數據重新添加到TempData。由於TempData的不允許添加重複鍵我創造了我自己的輔助方法來刪除,然後重新添加鍵值:

public static void AddNew(this TempDataDictionary tempData, string key, object obj) 
{ 
    if (tempData.ContainsKey(key)) tempData.Remove(key); 

    tempData.Add(key, obj); 
} 
1

我有同樣的問題,但走近它一個稍微不同的方式 - 我用它與單純的OpenID工作的窗體身份驗證方法...如果我的供應商的回報驗證的,我做的以下

   var fields = openid.Response.GetExtension(typeof(ClaimsResponse)) as ClaimsResponse; 

       if (fields != null) 
       { 
        TempData["Email"] = fields.Email; 
        TempData["Nickname"] = fields.Nickname; 
       } 

       FormsAuthentication.RedirectFromLoginPage(openid.Response.ClaimedIdentifier, false); 

       break; 

這意味着我不需要通過任何一種認證令牌左右 - 這個代碼執行後,我知道我的用戶進行身份驗證。

因此,將傳遞控制權的操作僅將TempData字段(如果已填充)複製到ViewData中並將它們傳遞到視圖上。

驗證是在這之後處理的 - 我不在乎什麼從OpenID返回(即它是否有效),我讓用戶編輯並保存,然後執行驗證。

+0

擺弄周圍的幾個小時後,我決定重新添加數據的TempData 。我發現你不能再次使用TempData.Add,因爲集合已經包含密鑰。所以我創建了自己的擴展方法來重新添加密鑰。 – DennyFerra 2009-06-29 18:43:24