2009-02-03 7 views
7

Wydaje się proste, ale okazuje się, że tak nie jest - głównie ze względu na fakt, że View nie może wiedzieć, w którą stronę przejdzie model i kontroler. Bez względu na to, jest to problem, który wymaga rozwiązania:Jak określić zwrotny URL linku do formularza logowania?

Mam link do logowania, który przenosi użytkownika do formularza, aby wprowadzić nazwę użytkownika i hasło. Gdy użytkownik kliknie "prześlij", chcę przekierować do strony, którą przeglądał. Najłatwiejszym sposobem na to wydaje się być podanie adresu URL do bieżącej strony jako zapytania (...?returnUrl=...) i wszystko inne jest już zbudowane.

Ale gdzie znajdę ten adres z mojego widoku podczas renderowania linku? W naturalny sposób nie mogę użyć funkcji RedirectToActionResult, ponieważ nie chcę przenosić użytkownika - tylko wyrenderować adres URL w łączu. Jak?


EDIT:

Mam teraz zaczął bounty na to pytanie, a więc widzę pasuje do wyjaśnienia moich potrzeb, jak również.

Mam UserControl o nazwie Login.ascx w moim folderze udostępnionym. W nim renderuję ActionLink do formularza logowania i jest on zawarty w stopce na mojej stronie głównej. Co chcę osiągnąć jest następujące:

Gdy actionlink jest renderowany, QueryString returnUrl jest dołączany ze na trasie do widoku, który jest aktualnie renderowane. Jeśli zostanie to wykonane, użytkownik zostanie przeniesiony z powrotem na stronę, którą przeglądał po udanym logowaniu z funkcjonalnością, która jest już wbudowana w ASP.NET MVC Framework.

Powód, dla którego poprzednie odpowiedzi były niewystarczające, polega głównie na tym, że nie dostarczyły one drogi do zbudowania adresu URL trasy do bieżącego widoku. Wiem, jak dodać querystring, ale nie wiem, jak znaleźć to, co umieścić w tym ciągu.

Aby oznaczyć odpowiedź jako z odpowiedzią, chcę metodę ponownego zbudowania trasy do aktualnie wyświetlanego widoku, z poziomu kontroli użytkownika na stronie głównej.

Odpowiedz

20

Rozwiązaniem jest użycie HttpContext.Current.Request.RawUrl tak:

<%= Html.ActionLink("log on", "LogIn", new { controller = "User", returnUrl = HttpContext.Current.Request.RawUrl }) %> 

lub z metodą wydłużania z MVC futures (Microsoft.Web.Mvc.dll):

<%= Html.ActionLink<AccountController>(c => c.LogOn("name", "password", false, HttpContext.Current.Request.RawUrl), "login here")%> 

ActionController jest domyślny w mvc, ale po prostu dodaj returnUrl do swojego.

+0

Nie miałem ogólnej wersji metody helpera ActionLink (czy powinienem w projekcie MVC RC Refresh? Czy brakuje mi czegoś?), Ale zadziałało to: <% = Html.ActionLink ("logowanie", "logowanie", nowe { controller = "User", returnUrl = HttpContext.Current.Request.RawUrl})%> –

+0

Wyjaśnienie - jeśli zmienisz wpis na ten kod, dostaniesz gadżety =) –

3

Jednym ze sposobów byłoby stworzenie linków, które wyślą użytkownika do formularza logowania, na przykład z returnUrl =/PageToReturnTo (<a href="/Account/Login/?returnUrl=/Product/10">Login</a>). Chcesz go napisać, aby URL powrotny był skonstruowany z twoich tras, ręczne pisanie tych linków na każdej stronie może być uciążliwe.

Domyślna akcja logowania w MVC ma już wbudowaną funkcję returnUrl. Wystarczy podać mu wartość, a zrobi resztę. Oto kopiuj i wklej podpis metody ze świeżego projektu.

public ActionResult Login(string username, string password, bool rememberMe, string returnUrl) 

Mam nadzieję, że to pomaga!

+0

Dzięki za odpowiedź! Osiągnąłem już tak daleko - to jest konstruowanie returnUrl z moich tras, czego nie robię. Link znajduje się na mojej stronie MasterPage, więc kodowanie na sztywno łącza na każdej stronie nie jest opcją. –

+0

Ponadto standardowa autoryzacja w ASP spowoduje dodanie? ZwrotuURL do dowolnego żądania znajdującego się w obszarze chronionym (tj. Ma plik web.config z regułami zezwalaj/odmów). –

0

nie wiem o ASPX, ale istnieje kilka problemów, napotykanych budowy to:

Kiedy użytkownik dostaje swoje hasło źle, a pętle całoroczne stronę logowania na kolejną, cel wciąż musi być zachowany.

My również postanowiliśmy zachować zmiennych POST do strony, która następnie wymaganego login just-in-time

1

Można użyć Page.Request.Url uzyskać trasę, która doprowadziła w aktualnie renderowane widzenia.

Chociaż jest to bardziej kosmetyczny detal, możesz zunifikować żądania, które przychodzą przez trasy "/" i "/default.aspx" i zawsze powracają do trasy "/". Mam właściwości pomocnika na mojej stronie wzorcowej, która robi dokładnie to.

protected Uri RouteUrl 
    { 
     get 
     { 
      if (Page.Request.Url.AbsolutePath.StartsWith("/default.aspx", StringComparison.OrdinalIgnoreCase)) 
      { 
       return new Uri(Request.Url, new Uri(Response.ApplyAppPathModifier("~/"))); 
      } 

      return Page.Request.Url; 
     } 
    }