Asp.net-Mvc-4

我應該如何在 MVC 4 中使用 ReturnUrl = ViewBag.ReturnUrl

  • November 21, 2013

我正在開發“ASP.NET MVC 4”應用程序。我正在使用/學習 SimpleMembershipProvider 並嘗試堅持使用創建的預設邏輯VS2012Internet 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的全部目的是自動將使用者發送回他們在驗證/授權之前嘗試訪問的頁面。

引用自:https://stackoverflow.com/questions/20123612