2011-09-13 44 views
5

Trong ngữ cảnh của ASP.net MVC3, tôi có dòng mã này trong một hành động điều khiển, cố gắng chuyển hướng đến một url cụ thể.Chuyển hướng (url) không hoạt động

return Redirect(returnUrl); 

returnUrl là chuỗi chứa "/ Home/Index /". Đối với một số lý do chuyển hướng không diễn ra và tôi vẫn còn trên cùng một màn hình. Tôi đã thử xóa dấu gạch chéo nhưng không thành công. Bất kỳ ý tưởng nào tại sao Chuyển hướng không diễn ra?

Trả lời

13

Phương pháp Redirect được dự định được sử dụng để chuyển hướng đến các url bên ngoài của trang web của bạn và bằng cách chuyển url đó tới một url tuyệt đối. Nếu bạn cần phải chuyển hướng đến một hành động điều khiển thuộc về trang web của bạn nó sẽ là tốt hơn để sử dụng này:

return RedirectToAction("Index", "Home"); 

Bằng cách này bạn không còn hardcoding url và mã của bạn ít mong manh với những thay đổi lộ trình. Điều này đang được nói, nếu bạn đang gọi hành động điều khiển thực hiện chuyển hướng này với AJAX bạn không thể mong đợi nó chuyển hướng trình duyệt ở bất cứ nơi nào => nó rõ ràng sẽ ở trên cùng một trang. Yêu cầu AJAX sẽ thành công sau tất cả các chuyển hướng và trong lần gọi lại thành công, bạn sẽ nhận được HTML cuối cùng của url /Home/Index như thể nó được yêu cầu mà không có AJAX.

Nếu bạn muốn chuyển hướng trong callback thành công của một AJAX gọi bạn có thể có lợi nhuận hoạt động điều khiển của bạn ví dụ như một đối tượng JSON chỉ url mục tiêu mà bạn muốn chuyển hướng đến:

return Json(new { redirectToUrl = Url.Action("Index", "Home") }); 

và gọi lại của bạn sử dụng window.location.href chức năng:

success: function(result) { 
    window.location.href = result.redirectToUrl; 
} 
+0

Trước hết, xin cảm ơn sự trả lời đầy đủ. Tôi không sử dụng AJAX ở đây, vì vậy chúng tôi có thể loại trừ phần thứ hai của câu trả lời của bạn. Lý tưởng nhất là tôi muốn sử dụng RedirectToAction() nhưng tôi đang sử dụng xác thực ở đây, nơi tôi đang nhận returnUrl làm trang được yêu cầu ban đầu. Yêu cầu ban đầu này có thể là bất kỳ trang nào trong ứng dụng của tôi. Vì vậy, tôi không thể chỉ hardcode điều khiển và hành động trong RedirectToAction() .Tôi có một tùy chọn cho tôi để làm việc ra phần Controller và Action từ returnUrl sử dụng kỹ thuật thao tác chuỗi (thậm chí sẽ rất khó) nhưng tôi đang tìm kiếm giải pháp tốt hơn. – Jatin

+0

@Nirvan, thay vì gửi một biến chuỗi returnUrl gửi 2 biến là bộ điều khiển và hành động. Bằng cách này bạn có thể xây dựng url yêu cầu. Nếu không thử sử dụng url tuyệt đối với Chuyển hướng như 'http: // yoursite.com/home/index'. –

+0

@Darain, Rất tiếc, tôi không rõ về nội dung xác thực. Việc xác thực asp.net theo mặc định theo dõi trang nào ban đầu được yêu cầu trước khi đăng nhập. Tôi không tự điền vào returnUrl. Ví dụ giả sử rằng người dùng cố gắng truy cập/Home/Index trước khi đăng nhập. Các bước xác thực Asp.net và chuyển hướng đến trang đăng nhập của ứng dụng của tôi. Đây là nơi máy chủ điền vào returnUrl là "/ Home/Index".Vì vậy, bạn thấy tôi chỉ nhận được một chuỗi (regurnUrl) trong Bộ điều khiển đăng nhập của tôi chứa url của trang được yêu cầu ban đầu. – Jatin

2

Nếu bạn đang bị mắc kẹt trên màn hình đăng nhập CÙNG sau khi cung cấp thông tin đăng nhập hợp lệ, có thể bạn chưa thiết lập các cookie xác thực Forms.

Bất cứ khi nào bạn sử dụng Redirect hoặc RedirectToLocal trong actionmethods nhập của bạn, hãy chắc chắn bạn gọi theo thứ tự sau:

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
return RedirectToLocal(returnUrl); 

Điều này đảm bảo, cookie được thiết lập trước khi Chuyển hướng, nếu không thì khách hàng sẽ coi như nếu người dùng chưa đăng nhập.

Cảm ơn

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