2010-10-22 11 views
6

Tomemos como ejemplo un proyecto de ASP.NET MVC predeterminado estándar creado por Visual Studio.ASP.NET MVC redirigir después del inicio de sesión a la página de donde provino un usuario

Estar en ../Home/About página que haga clic en Iniciar sesión enlace y acceder a la página ../Account/LogOn. Después de iniciar sesión, me redireccionan a la página Home, no a la página Home/About desde la que llego a la página LogOn. ¿Por qué es eso?

Aunque, en el AccountController tenemos:

[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); 
    } 

es el problema en el hecho de que string returnUrl está vacía después de hacer clic en Iniciar sesión enlace? Cómo asignarle un valor al hacer clic en Iniciar sesión en el enlace?

¿Cómo redirigir a un usuario, después de iniciar sesión, a la página de la que proviene?

Ver código:

<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> 
<% } %> 

Editado (añade):

hecho, se descubrió que por encima de vista de código no es muy relevante para el problema, en lugar que debería haber mirado esto (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")%> ] 
<% 
} 
%> 
+0

¿Podemos ver su punto de vista? y su web.config? – Gregoire

Respuesta

14

Al generar el inicio de sesión enlazar lo necesario para pasar el parámetro de cadena returnUrl consulta:

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

Sí, de esta manera funciona perfectamente. Gracias. +1 – rem

+2

Las plantillas más recientes de ASP.NET MVC están usando 'RedirectToLocal'. Entonces debe usar 'Request.Url.PathAndQuery' de acuerdo con [esto] (http://stackoverflow.com/questions/27560840/redirecttolocal-goes-to-a-different-url) – roland

+0

que funciona @rolan – usman

2

Por qué es tan fácil de responder.

El ReturnURL no está definida, ya que ir a logOn por sí mismo haciendo clic en Iniciar sesión en

Si una página tiene restricciones a cualquiera de los roles o usuarios, usted es redireccionado automáticamente a la acción de inicio de sesión y la ReturnUrl se establecerá.

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

lo que se puede hacer es cambiar el botón Iniciar sesión en la esquina para tomar un ReturnURL con él.

+0

Gracias por la información útil, +1 – rem

2

Se dispone a enviar un formulario, y el formulario no tiene un valor para el ReturnURL, así que no estoy sorprendido de que tu returnurl sea nulo.

Esto es lo que debe hacer en el extremo del cliente.

- Añadir esto dentro de su formulario en alguna parte

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

Entonces estás usando enlace de modelos ...No uso el enlace de modelo, por lo que no estoy seguro de si returnurl se vinculará correctamente con el parámetro extra que ha declarado además del modelo.

Si no, entonces hacer esto dentro de su código del lado del servidor

myurl = Request.Form["returnurl"] 

debe trabajar para usted ahora.

+0

Cyril, I fue de otra manera en resolver esto. De todos modos, gracias por tu propuesta. Me ayudará a comprender mejor el problema. +1 – rem

Cuestiones relacionadas