2014-04-02 48 views
2

我看了很多帖子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> 

回答

4

只需在您的登錄操作鏈接中將當前路由/ URL解析爲一個routeValue即可。

像這樣的東西應該做的伎倆

@Html.ActionLink("Login", "Login", "Account", 
    new {@returnUrl = Url.Action(ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString())}) 
+0

,如果有在絕對URL,例如_http的ARG://yardpenalty.com/sporting-goods/1234_的ARG被最後放置在Url.Action?你也知道一個好地方,我可以更熟悉'ViewData.RouteData'的工作原理嗎?太感謝了。 – yardpenalty

+1

正確。或者,使用@returnUrl = ViewContext.HttpContext.Request.Url.PathAndQuery。至於RouteData,它基本上只是從路由中提取的所有參數的集合,包括「controller」和「action」。這裏有一篇關於這一切的相當不錯的文章http://www.4guysfromrolla.com/articles/012710-1.aspx – SlightlyMoist

+0

一旦我開始工作,我會在我的問題中顯示結果,並給你信譽的答案。再次感謝。 – yardpenalty

5

類似的想法,但我只是添加ViewBag.ReturnUrl在視圖中,並修改了註冊和登錄方法。這是因爲並非所有的登錄和註冊位置都想要返回到該頁面,並且這種方式可以控制視圖的基礎。

@{ 
    ViewBag.Title = "My Page"; 
    ViewBag.ReturnUrl = "/Home/Live"; 
} 

而在_LoginPartial:

@Html.ActionLink("Log in", "Login", new { area = "", controller = "Account", ReturnUrl=ViewBag.ReturnUrl }, new { id = "loginLink" }) 
+0

這是正確的解決方案。它在MVC 5中適用於我。 – santubangalore

相關問題