ASP.NET MVC redirection after entering the page from which the user came

Take the standard default ASP.NET MVC project created by Visual Studio as an example.

From the ../Home/About page, click the Login link and go to the ../Account/LogOn page. After logging in, I am redirected to the Home page, and not to the Home/About page, from which I go to the LogOn page. Why is this?

Although in AccountController we have:

 [HttpPost] public ActionResult LogOn(LogOnModel model, string returnUrl) { if (ModelState.IsValid) { if (MembershipService.ValidateUser(model.UserName, model.Password)) { FormsService.SignIn(model.UserName, model.RememberMe); if (!String.IsNullOrEmpty(returnUrl)) { return Redirect(returnUrl); } else { return RedirectToAction("Index", "Home"); } } else { ModelState.AddModelError("", "The user name or password provided is incorrect."); } } // If we got this far, something failed, redisplay form return View(model); } 

Is the problem that the string returnUrl empty after clicking the Login link? How to assign it a value when you click the Login link?

How to redirect the user after entering the page from which he or she came?

View code:

 <asp:Content ID="loginContent" ContentPlaceHolderID="MainContent" runat="server"> <h2>Log On</h2> <p> Please enter your username and password. <%: Html.ActionLink("Register", "Register") %> if you don't have an account. </p> <% using (Html.BeginForm()) { %> <%: Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.") %> <div> <fieldset> <legend>Account Information</legend> <div class="editor-label"> <%: Html.LabelFor(m => m.UserName) %> </div> <div class="editor-field"> <%: Html.TextBoxFor(m => m.UserName) %> <%: Html.ValidationMessageFor(m => m.UserName) %> </div> <div class="editor-label"> <%: Html.LabelFor(m => m.Password) %> </div> <div class="editor-field"> <%: Html.PasswordFor(m => m.Password) %> <%: Html.ValidationMessageFor(m => m.Password) %> </div> <div class="editor-label"> <%: Html.CheckBoxFor(m => m.RememberMe) %> <%: Html.LabelFor(m => m.RememberMe) %> </div> <p> <input type="submit" value="Log On" /> </p> </fieldset> </div> <% } %> 

Edited (added):

It turned out that the above view code is not very appropriate for the problem, instead I had to look at this ( LogOnUserControl.ascx ):

 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> <% if (Request.IsAuthenticated) { %> Welcome <b><%: Page.User.Identity.Name %></b>! [ <%: Html.ActionLink("Log Off", "LogOff", "Account") %> ] <% } else { %> [ <%: Html.ActionLink("Log On", "LogOn", "Account")%> ] <% } %> 
+6
redirect c # asp.net-mvc
source share
3 answers

When you create the LogOn link, you need to pass the query string parameter returnUrl :

 <%: Html.ActionLink("Log On", "LogOn", "Account", new { returnUrl = Request.Url }, null)%> 
+14
source share

Why is it pretty easy to answer.

ReturnURL not installed, because you go to logOn yourself by clicking the "Login" button

If the page has restrictions for roles or users, you are automatically redirected to the logOn action and ReturnUrl will be set.

 http://localhost:50152/Account/LogOn?ReturnUrl=%2f2011-2012%2fReeksen 

what could be done is to change the "Login" button in the corner to take ReturnURL with it.

+2
source share

You submit the form and your form does not matter for returnurl, so I am not surprised that your returnurl is null.

Here is what you need to do on the client side.

- add this to your form somewhere

 <input type='hidden' value=<%myurl%> name='returnurl' /> 

Then you use model binding ... I do not use model binding, so I'm not sure if returnurl will be correctly bound to the extra parameter that you specified in addition to the model.

If this is not the case, do it in your server code

 myurl = Request.Form["returnurl"] 

Now you must work for you.

+2
source share

All Articles