2012-03-04 19 views
25

ho link sul mio punto di vista rasoio in questo modo:reindirizzamento per tornare url dopo il login

<a href="Home/Login?ReturnUrl=Disputes/Index"> disputes</a> 

dentro il mio metodo di azione di login, sto usando questo:

public ActionResult Login(string returnUrl) { 
      if (string.IsNullOrEmpty(returnUrl) && Request.UrlReferrer != null) 
       returnUrl = Server.UrlEncode(Request.UrlReferrer.PathAndQuery); 

     if (Url.IsLocalUrl(returnUrl) && !string.IsNullOrEmpty(returnUrl)) 
     { 
      ViewBag.ReturnURL = returnUrl; 
     } 

     return View(); 
    } 

In considerazione Sto usando questo :

@Html.Hidden("returnUrl",@Request.QueryString) 

poi nel metodo di azione posta:

public ActionResult LogOn(LogOnModel model, string returnUrl) 
     { 
      if (ModelState.IsValid) 
      { 
       if (membershipService.ValidateUser(model.UserName, model.Password, model.Type)) 
       { 
        formsAuthenticationService.SignIn(model.UserName, model.RememberMe); 
        SetUserInfo(model.UserName); 

       string decodedUrl = ""; 
       if (!string.IsNullOrEmpty(returnUrl)) 
        decodedUrl = Server.UrlDecode(returnUrl); 

       if (Url.IsLocalUrl(decodedUrl))      
        return Redirect(decodedUrl); 
        else 
return Redirect("Home", Index); 

} 
} 
} 

si sta reindirizzando a: /Disputes/Index ma dovrebbe andare a myApp/Disputes/Index dove l'url con querystring è come questo. /myApp/Home/Login?ReturnUrl=/Disputes/Index

Come posso risolvere questo problema?

+0

prova a utilizzare disputes (con "/") o non provare alcuna stringa di query per testare il metodo UrlReferrer. – Oliver

+0

@Oliver: ho provato senza querystring e non ha funzionato ... – DotnetSparrow

risposta

39

io uso una combinazione di suggestione e Request.UrlReferrer sopra per ottenere la posizione precedente:

public ActionResult LogOn(string returnUrl) 
    { 
     //So that the user can be referred back to where they were when they click logon 
     if (string.IsNullOrEmpty(returnUrl) && Request.UrlReferrer != null) 
      returnUrl = Server.UrlEncode(Request.UrlReferrer.PathAndQuery); 

     if (Url.IsLocalUrl(returnUrl) && !string.IsNullOrEmpty(returnUrl)) 
     { 
      ViewBag.ReturnURL = returnUrl; 
     } 
     return View(); 
    } 

In questo modo non devo mettere la posizione nella ActionLink.

Compilare un campo nascosto nella pagina di accesso utilizzando ViewBag.ReturnURL. Poi nel Accesso HttpPost ActionResult I reindirizzare l'utente alla posizione nel campo nascosto (se esiste):

[HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     //returnURL needs to be decoded 
     string decodedUrl = ""; 
     if (!string.IsNullOrEmpty(returnUrl)) 
      decodedUrl = Server.UrlDecode(returnUrl); 

     //Login logic... 

     if (Url.IsLocalUrl(decodedUrl)) 
     { 
      return Redirect(decodedUrl); 
     } 
     else 
     { 
      return RedirectToAction("Index", "Home"); 
     } 
    } 
+0

Ho usato il campo nascosto in login pagina e ora posso vedere il valore returnurl nel metodo di azione login come questo: ReturnUrl =% 2fDisputes% 2fIndex ma fallisce qui: if (Url.IsLocalUrl (returnUrl) && returnUrl.Length> 1 && returnUrl.StartsWith ("/") &&! returnUrl.StartsWith ("//") &&! returnUrl.StartsWith ("/ \\")) return Redirect (returnUrl); – DotnetSparrow

+0

nella mia azione di login post, ho: string decodedUrl = ""; if (! String.IsNullOrEmpty (returnUrl)) decodedUrl = Server.UrlDecode (returnUrl); if (Url.IsLocalUrl (decodedUrl)) { return Redirect (decodedUrl); } Questo funziona per me. L'URL è sicuramente valido? – Oliver

+0

Ho aggiornato la mia risposta con il mio metodo post – Oliver

7

In questo caso è possibile che l'azione LogOn abbia un parametro returnUrl e se non è vuota, invece di reindirizzare a Home/Index è possibile restituire Redirect(returnUrl);. Dai un'occhiata al AccountController predefinito generato da VS quando crei un nuovo progetto. Lo fa esattamente.

+0

Grazie per la risposta rapida. Ho scritto questo, ma ancora returnUrl è vuoto nel metodo action. ho creato un URL di ritorno errato in href? Si prega di suggerire – DotnetSparrow

+0

Potrebbe essere necessario url codificare il valore: 'disputes'. –

+0

no, dopo la codifica: returnurl nel metodo di accesso è null dove come querystring come returnurl come questo: Public ActionResult Login (modello LogOnModel, stringa returnUrl) e/Home/Login? ReturnUrl = Disputes% 2FIndex – DotnetSparrow

5

Se il ReturnURL è null, assicurarsi che si sta chiamando il metodo di azione dal punto di vista come segue : Controller

// FormMethod.post is optional 
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post)) 
{ 
    // login view html 
} 

account:

[AllowAnonymous] 
public ActionResult Login(string returnUrl) 
{ 
    ViewBag.ReturnUrl = returnUrl; 
    return View(); 
} 
+0

Sì, è importante farlo bene. Per me, l'oggetto anonimo che impostava una classe nel mio HTML veniva usato come oggetto anon per i valori di route, quindi ReturnUrl non tornava, invece vedevo 'class' nei parametri della query. Meglio controllare il markup reso finale. Io uso questo: '@using (Html.BeginForm (" BetaLogin "," Autenticazione ", nuovo {ReturnUrl = this.Request.Params [" ReturnUrl "]}, FormMethod.Post, nuovo {@class =" o- box-section "}))' –

+0

L'impostazione dell'URL di ritorno sul modulo ha funzionato perfettamente per me con modifiche minime al codice. Grazie! – BrianLegg

1
 //Utilities   
     public static ReturnUrl GetReturnUrlValues(string returnUrl) 
     { 
      //0:Action,1:Controller,2:Area:,3:Id 
      ReturnUrl vm = new ReturnUrl(); 
      using (TBBSEntities context = new TBBSEntities()) 
      { 
       if (returnUrl != null && returnUrl.Length > 10) 
       { 
        var counterValue = returnUrl.Split('/'); 
        vm.Action = counterValue[0]; 
        vm.Controller = counterValue[1]; 
        vm.Area = counterValue[2] == "0" ? "" : counterValue[2] ; 
        vm.Id = Convert.ToInt32(counterValue[3]); 
        vm.NullStatus = true; 
        return vm; 
       } 
       vm.NullStatus = false; 
       return vm; 
      } 
     } 

     //Controller 
     var transformUrl = Utilities.GetReturnUrlValues(returnUrl); 
      if (transformUrl.NullStatus) 
      { 
      return RedirectToAction(transformUrl.Action, transformUrl.Controller, 
        new { area = transformUrl.Area, id = transformUrl.Id }); 
      } 
      return RedirectToAction("Action", "Controller", new { area = "Area", Id}); 


     //View 
     var returnUrl = "Action/Controller/Area/" + @Model.Id; 
Problemi correlati