我應該如何在 MVC 4 中使用 ReturnUrl = ViewBag.ReturnUrl
我正在開發“ASP.NET MVC 4”應用程序。我正在使用/學習 SimpleMembershipProvider 並嘗試堅持使用創建的預設邏輯
VS2012(Internet template如果我沒記錯的話,開箱即用的“SimpleMembershipProvider”)。我被困在
AccountController我無法弄清楚我可以如何使用這種方法的地方:private ActionResult RedirectToLocal(string returnUrl) { if (Url.IsLocalUrl(returnUrl)) { return Redirect(returnUrl); } else { return RedirectToAction("Index", "Home"); } }據我了解,整個想法是重定向到您決定登錄的位置(正是我想要完成的)。我看了一下它是如何在視圖中使用的:
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))尋找一個實際
ViewBag.ReturnUrl設置了一些值的地方,我在這裡只得到了這個方法:[AllowAnonymous] public ActionResult Login(string returnUrl) { ViewBag.ReturnUrl = returnUrl; return View(); }而且我對我應該如何獲得位置/網址感到非常困惑。我設置了一些斷點,但我從未見過
returnUrl有什麼不同的東西null,在這種情況下對我來說似乎很合乎邏輯,因為它在任何地方都沒有價值(除非我當然錯過了一些東西)。所以我真的無法弄清楚這是如何工作的。我發布以上內容只是為了表明我試圖做我的功課,我盡可能多地調查,但我沒有找到答案,所以我在這裡問。您能否提供有關其實際工作原理的解釋/範例?
當使用表單身份驗證並且使用者未經過身份驗證或授權時,ASP.NET 安全管道將重定向到登錄頁面,並在查詢字元串中將returnUrl作為參數傳遞給重定向到登錄頁面的頁面。登錄操作獲取此參數的值並將其放入 ViewBag 中,以便將其傳遞給 View。
[AllowAnonymous] public ActionResult Login(string returnUrl) { ViewBag.ReturnUrl = returnUrl; return View(); }然後視圖將該值儲存在視圖中這行程式碼所示的表單中。
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))它儲存在視圖中的原因是,當使用者在輸入使用者名和密碼後執行送出時,處理回發的控制器操作將有權訪問此值。
[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public ActionResult Login(LoginModel model, string returnUrl) { if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe)) { return RedirectToLocal(returnUrl); } // If we got this far, something failed, redisplay form ModelState.AddModelError("", "The user name or password provided is incorrect."); return View(model); }如果模型狀態是有效的並且它們通過呼叫WebSecurity.Login方法進行了身份驗證,那麼它將呼叫RedirectToLocal方法,其值來自視圖,它最初來自創建視圖的登錄操作。
如果使用者沒有被重定向到登錄頁面,returnUrl值將為 null,就像他們在預設佈局中僅點擊頁面頂部的登錄連結時的情況一樣。在這種情況下,使用者將在成功登錄後被重定向到首頁。returnUrl的全部目的是自動將使用者發送回他們在驗證/授權之前嘗試訪問的頁面。