2010-10-22 50 views
6

Hãy xem ví dụ về dự án ASP.NET MVC mặc định chuẩn được tạo bởi Visual Studio.Chuyển hướng ASP.NET MVC sau khi đăng nhập vào trang mà người dùng đến từ

Đang ở trên ../Home/About trang Tôi nhấp vào Đăng nhập liên kết và truy cập trang ../Account/LogOn. Sau khi đăng nhập, tôi được chuyển hướng đến trang Home, không phải trang Home/About mà tôi truy cập vào trang LogOn. Tại sao lại như vậy?

Mặc dù, trong AccountController ta có:

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

Là vấn đề trong thực tế là string returnUrl trống sau khi nhấp Đi Vào liên kết? Cách chỉ định giá trị khi nhấp vào liên kết Đăng nhập?

Cách chuyển hướng người dùng, sau khi đăng nhập, đến trang mà họ đến từ đâu?

Xem mã:

<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 (thêm):

Dường như trên chế độ code không phải là rất có liên quan đến vấn đề này, thay vào đó tôi nên đã xem xét này (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

chúng ta có thể thấy chế độ xem của bạn không? và web.config của bạn? – Gregoire

Trả lời

14

Khi bạn tạo Logon liên kết bạn cần phải vượt qua chuỗi tham số returnUrl truy vấn:

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

Vâng, theo cách này, nó hoàn toàn hoạt động. Cảm ơn. +1 – rem

+2

Mẫu ASP.NET MVC mới hơn đang sử dụng 'RedirectToLocal'. Vì vậy, bạn nên sử dụng 'Request.Url.PathAndQuery' theo [this] (http://stackoverflow.com/questions/27560840/redirecttolocal-goes-to-a-different-url) – roland

+0

hoạt động @rolan – usman

2

Tại sao điều này là khá dễ dàng để trả lời.

Các ReturnURL không được thiết lập, bởi vì bạn đi-logOn mình bằng cách nhấp vào Log On

Nếu một trang có hạn chế đối với một trong hai vai trò hoặc người sử dụng, bạn sẽ được tự động chuyển đến hành động đăng nhập, và ReturnUrl sẽ được thiết lập.

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

những gì người ta có thể làm là thay đổi nút Đăng nhập ở góc để quay trở lại URL với nó.

+0

Cảm ơn thông tin hữu ích, +1 – rem

2

Bạn đang gửi một hình thức và hình thức của bạn không có một giá trị cho ReturnUrl, vì vậy tôi không ngạc nhiên rằng returnurl của bạn là null.

Đây là những gì bạn cần làm ở cuối ứng dụng khách.

- Thêm này trong hình thức của bạn ở đâu đó

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

Sau đó, bạn đang sử dụng mô hình ràng buộc ...Tôi không sử dụng mô hình ràng buộc, vì vậy tôi không chắc liệu returnurl sẽ được ràng buộc một cách chính xác để các tham số thêm bạn đã tuyên bố ngoài các mô hình.

Nếu không được thì làm được điều này trong mã phía máy chủ của bạn

myurl = Request.Form["returnurl"] 

nên làm việc cho bạn ngay bây giờ.

+0

Cyril, tôi đã đi một cách khác để giải quyết vấn đề này. Dù sao, cảm ơn đề nghị của bạn. Nó sẽ giúp tôi hiểu rõ hơn về vấn đề này. +1 – rem

Các vấn đề liên quan