2012-03-04 59 views
25

Tôi có liên kết trên quan điểm dao cạo của tôi như thế này:chuyển hướng trở lại url sau khi đăng nhập

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

bên trong phương pháp hành động đăng nhập của tôi, tôi đang sử dụng này:

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

Theo quan điểm của tôi đang sử dụng này :

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

sau đó trong bài phương pháp hành động:

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

} 
} 
} 

nó đang chuyển hướng đến: /Disputes/Index nhưng nó sẽ chuyển đến myApp/Disputes/Index trong đó url với chuỗi truy vấn giống như thế này. /myApp/Home/Login?ReturnUrl=/Disputes/Index

Tôi làm cách nào để giải quyết vấn đề này?

+0

hãy thử sử dụng disputes (với dấu "/") hoặc thậm chí không thử chuỗi truy vấn để kiểm tra phương thức UrlReferrer. – Oliver

+0

@Oliver: Tôi đã thử không có chuỗi truy vấn và nó không hoạt động ... – DotnetSparrow

Trả lời

39

tôi sử dụng một sự kết hợp của các gợi ý và Request.UrlReferrer trên để có được vị trí theo thời gian:

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

Bằng cách này tôi không cần phải đặt vị trí trong ActionLink.

Tôi điền trường ẩn trong trang đăng nhập bằng cách sử dụng ViewBag.ReturnURL. Sau đó, trong Login HTTPPost ActionResult tôi chuyển hướng người dùng tới vị trí trong lĩnh vực ẩn (nếu có):

[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

Tôi đã sử dụng trường ẩn trong đăng nhập trang và bây giờ tôi có thể thấy giá trị returnurl trong phương thức hành động đăng nhập như thế này: ReturnUrl =% 2fDisputes% 2fIndex nhưng không thành công ở đây: if (Url.IsLocalUrl (returnUrl) && returnUrl.Length> 1 && returnUrl.StartsWith ("/") &&! returnUrl.StartsWith ("//") &&! returnUrl.StartsWith ("/ \\")) trả về Chuyển hướng (returnUrl); – DotnetSparrow

+0

trong hành động đăng nhập của tôi, tôi có: string decodedUrl = ""; if (! String.IsNullOrEmpty (returnUrl)) decodedUrl = Server.UrlDecode (returnUrl); nếu (Url.IsLocalUrl (decodedUrl)) { trả lại Chuyển hướng (decodedUrl); } Điều này phù hợp với tôi. URL có chắc chắn hợp lệ không? – Oliver

+0

Tôi đã cập nhật câu trả lời của mình với phương pháp đăng bài – Oliver

7

Trong trường hợp này, bạn có thể có hành động LogOn của mình nhận tham số returnUrl và nếu nó không trống, thay vì chuyển hướng đến Trang chủ/Chỉ mục, bạn có thể trả lại Redirect(returnUrl);. Hãy xem AccountController mặc định được tạo bởi VS khi bạn tạo một dự án mới. Nó thực hiện chính xác điều đó.

+0

Cảm ơn bạn đã phản hồi nhanh. Tôi có văn bản này nhưng vẫn returnUrl trống trong phương thức hành động. tôi đã tạo sai url trả về trong href chưa? Vui lòng đề xuất – DotnetSparrow

+0

Bạn có thể cần phải mã hóa url giá trị: 'disputes'. –

+0

không, samething sau khi mã hóa: returnurl trong phương pháp hành động đăng nhập là null, nơi querystring như returnurl như thế này: public ActionResult Login (LogOnModel model, string returnUrl) và/Home/Login? ReturnUrl = Tranh chấp% 2FIndex – DotnetSparrow

5

Nếu ReturnURLnull, hãy chắc chắn bạn đang gọi phương thức hành động từ quan điểm như sau : điều khiển

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

tài khoản:

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

Vâng, điều quan trọng để có được quyền này. Đối với tôi, đối tượng ẩn danh thiết lập một lớp trong HTML của tôi đã được sử dụng làm đối tượng anon cho các giá trị tuyến đường, vì vậy ReturnUrl không quay trở lại, thay vào đó tôi đã thấy 'lớp' trong các tham số truy vấn. Tốt nhất để kiểm tra đánh dấu kết quả cuối cùng. Tôi sử dụng điều này: '@using (Html.BeginForm (" BetaLogin "," Xác thực ", mới {ReturnUrl = this.Request.Params [" ReturnUrl "]}, FormMethod.Post, new {@class =" o- box-section "}))' –

+0

Đặt url trả về trên biểu mẫu hoạt động hoàn hảo cho tôi với các thay đổi mã tối thiểu. Cảm ơn! – 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; 
Các vấn đề liên quan