2012-01-02 60 views
0

這似乎是不可能的,但我會問無論如何。 這是場景如何在重定向後更新div的內容?

我有一個MVC 3視圖加載3個部分視圖,一個用於登錄,一個用於註冊,另一個用於OpenID登錄。

然而,前2項與Ajax很好,第三視圖使用AJAX張貼到我的OpenID的控制器去哪兒做一些DotNetOpenAuth魔術

例子:

var response = authenticationRequest.RedirectingResponse; 
       if(response.Status == HttpStatusCode.Redirect) 
       { 
        return Json(new {redirectUrl=response.Headers[HttpResponseHeader.Location] });  
       } 

我來自控制器的OpenID登錄表單發送到這樣做從返回的JSON重定向, 「記住這篇文章是通過ajax」。所以在重定向之後,我想用基於重定向到提供程序後發生的事情的新視圖替換原始的openid登錄部分視圖的div內容,用戶登錄,並在我的actionMethod中獲得響應。例如,我將檢查我的數據庫,看看我是否已經擁有該開放標識的帳戶。如果我不想,我想給用戶提供一些基本問題的部分視圖等,並讓他們添加開放的id帳戶。

因此,似乎這是不可能的,因爲重定向殺死任何獲取數據回原始頁面的機會。

任何想法?

過程子彈的要求:

  • 主視圖呈現與表單
  • 局部視圖內表確實AJAX交到ActionMethod在控制器
  • ActionMethod在控制器返回的Json用的局部視圖redirectUrl
  • OnSuccess回調函數讀取json結果並執行客戶端重定向到redirectUrl
  • 用戶以重定向方式登錄到openid提供程序位置
  • OpenID提供商將結果發送回生成該初始的Json的redirectUrl結果相同ActionMethod
  • 上開放的。ID執行DB查詢和在如果發現如果用戶沒有找到返回局部視圖或記錄用戶。

我想有視圖id沒有找到用戶加載到登錄表單所在的原始div中。這是行不通的。

+0

也許子彈點這個有點難以閱讀和理解這裏發生了什麼。也許它只是我,但我只是交叉眼睛:) – 2012-01-02 18:21:52

+0

添加項目符號:) – CrazyCoderz 2012-01-02 18:38:33

+0

事實上,我想這個信息在同一頁面上很可能不是功能上最好的方法。我只是想知道這樣的事情是否可能。 – CrazyCoderz 2012-01-02 18:44:18

回答

1

整頁重定向破壞了原始頁面,所以不行,你不能有一個後續的重定向將用戶帶回原始頁面,只更新一個<DIV>

您至少有兩種選擇:

  1. 乾脆把整個頁面重定向,並且當認證結果由提供你的MVC控制器回來重新呈現整個原始頁面。下行:控制器無法從之前存在的其他視圖恢復任何用戶特定的狀態。

  2. 使用彈出窗口登錄用戶,當登錄完成後,彈出窗口自動關閉,將身份驗證數據傳回父頁面,然後可以重新呈現所需的任何部分。

DotNetOpenAuth同時支持這兩種方法,但是當然在控制器和視圖中有許多代碼需要編寫,在庫的外部。我確實有一個示例,展示了相對優化的#2實現。這是在http://openidux.dotnetopenauth.net/,但該網站似乎是在現在。但你可以在這裏看到一個截圖並下載一個項目模板:http://visualstudiogallery.msdn.microsoft.com/81153747-70d7-477b-b85a-0374e7edabef

0

您可以簡單地將數據存儲在會話中,使用緩存或使用TempData。 緩存當然會清除,所以不需要維護。

TempData在讀取後會自行清除。因此,即使沒有將其存儲在數據庫中,您也可以再次訪問這些數據。

+0

感謝您的回覆先生。我沒有收到數據的問題,這更像是一個可用性問題,很可能是因爲我不希望將用戶發送到單獨的視圖以添加開放式ID帳戶。我永遠不希望他們離開最初的登錄頁面。我知道可能不實際。 – CrazyCoderz 2012-01-02 19:51:00

+0

我將嘗試執行重定向回到登錄頁面,並將呈現爲視圖的視圖存儲在TempData中的關聯ViewModel數據中。您將您的想法存儲在TempData中,讓ol大腦受到歡迎。我會很快回復你。也許使用一點Jquery替換TemData視圖的現有部分。 – CrazyCoderz 2012-01-02 20:33:18

+0

TempData在我的重定向中遇到了問題,有點像預期的那樣,但它確實似乎可以使用cookie。 (TempData.ContainsKey(「AddOpenId」)) – CrazyCoderz 2012-01-02 21:30:41