我看了很多帖子SO約RETURNURL因爲它涉及到由[authorize] MyController
默認窗體身份驗證,但我還沒有簡單地傳遞RETURNURL讀什麼其中唯一的身份驗證發生在[HttpPost]之後的登錄或註冊表單和匿名用戶。 在這種情況下,我希望重定向來自原始鏈接並傳遞給用戶通過表單身份驗證進行身份驗證的操作。這個重定向應該讓用戶回到正在查看的頁面,他們1)點擊註冊或登錄ActionLinks,然後2)成功提交表單。這是在開發服務器上,所以HTTPS不是ATM的要求。通RETURNURL從ActionLink的從視野中登錄窗體重定向返回查看
這裏是沒有必要的語法/代碼的元素用於使RETURNURL
_LoginPartial:
<li>@Html.ActionLink("Register", "Register", "Account", routeValues: null}, htmlAttributes: new { id = "registerLink" })</li> //returnUrl???
<li>@Html.ActionLink("Log in", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })</li> // returnUrl???
登錄檢視:
@using (Html.BeginForm()){...} //new { returnUrl } ???
登錄戈牛逼的ActionResult:
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
//There is other ways to store the route
TempData["ReturnUrl"] = returnUrl;
return View();
}
登錄後的ActionResult:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model)
{
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
return RedirectToLocal(TempData["ReturnUrl"].ToString());
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
解決方案 感謝SlightlyMoist我能解決這個問題。雖然代碼很小,但ViewContext.RouteData.Values["key"]
的能力和專有技術似乎是無價的IMO。所以做按SM唯一的修改是在_LoginPartial鑑於ActionLinks內部完成:
<li>
@Html.ActionLink("Register", "Register", "Account", routeValues: new {@returnUrl = Url.Action(ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), ViewContext.RouteData.Values["id"])}, htmlAttributes: new { id = "registerLink" })
</li>
<li>
@Html.ActionLink("Log in", "Login", "Account", routeValues: new {@returnUrl = Url.Action(ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), ViewContext.RouteData.Values["id"])}, htmlAttributes: new { id = "loginLink" })
</li>
ALSO 按照SM再次,在ViewContext.HttpContext.Request.Url.PathAndQuery
工程,以及:
<li>
@Html.ActionLink("Register", "Register", "Account", routeValues: new {@returnUrl = ViewContext.HttpContext.Request.Url.PathAndQuery},htmlAttributes: new { id = "registerLink" })
</li>
,如果有在絕對URL,例如_http的ARG://yardpenalty.com/sporting-goods/1234_的ARG被最後放置在Url.Action?你也知道一個好地方,我可以更熟悉'ViewData.RouteData'的工作原理嗎?太感謝了。 – yardpenalty
正確。或者,使用@returnUrl = ViewContext.HttpContext.Request.Url.PathAndQuery。至於RouteData,它基本上只是從路由中提取的所有參數的集合,包括「controller」和「action」。這裏有一篇關於這一切的相當不錯的文章http://www.4guysfromrolla.com/articles/012710-1.aspx – SlightlyMoist
一旦我開始工作,我會在我的問題中顯示結果,並給你信譽的答案。再次感謝。 – yardpenalty