2013-04-22 16 views
7

Tôi có bộ lọc hành động tùy chỉnh, bên trong OnActionExecuting, tùy thuộc vào tiêu chí nhất định, đăng xuất người dùng và chuyển hướng họ đến trang chủ của trang web. Mã (bị trả lại) cho phần chuyển hướng ở bên dướiĐặt TempData trong ActionFilterAttribute

filterContext.Controller.TempData.Add("key", "Message"); 

    filterContext.Result = new RedirectResult("/"); 

Như trên, tôi cũng thiết lập thông báo tempData. Vì người dùng đã đăng xuất, khi họ truy cập trang chủ, thuộc tính [Authorize] sẽ chuyển hướng họ đến trang GET đăng nhập. Trên giao diện đăng nhập, tôi đang hiển thị bất kỳ tin nhắn nào từ bên trong tempData. Tuy nhiên trong tình huống này tempData trống.

Hành vi này rất giống với cách POST đăng nhập của tôi hoạt động (nếu không hợp lệ, nó chuyển hướng về nhà, chuyển hướng để đăng nhập và hiển thị thông báo tempData được đặt trong bài đăng nhập). Mã này có thể được nhìn thấy dưới đây

TempData.Add("key", errorMessage); 

    return Redirect("/")); 

Lý do tôi đang làm nó theo cách này, chứ không phải là chuyển hướng cụ thể đến trang đăng nhập được vì mã này được phân phối trên nhiều trang web, vì vậy chúng tôi không biết những gì url đăng nhập GET là .

Có ai có bất kỳ thông tin nào về lý do tại sao tính năng này hoạt động cho POST đăng nhập chứ không phải cho Chuyển hướng ActionFilter không?

Edit:

Nếu tôi loại bỏ các cuộc gọi logout trong bộ lọc hành động tùy chỉnh, TempData vẫn đặt trong hành động Trang chủ - tuy nhiên điều này không giải thích lý do tại sao nó hoạt động cho đăng nhập POST nhưng không phải là lọc hành động?

Trả lời

4

Vì vậy, hóa ra là khi tôi đăng xuất khỏi người dùng khỏi hệ thống, tôi cũng từ bỏ phiên (gọi số HttpContextBase.Session.Abandon()) và cũng đặt lại id phiên cookie. Chúng ảnh hưởng đến hành vi TempData. Bằng cách xóa các cuộc gọi này, tempData giờ đã được đặt và hiển thị chính xác.

-1

đặt kết quả thành new RedirectResult("/") sẽ làm cho máy chủ xử lý hiện tại dừng lại và gửi ứng dụng cho khách hàng, yêu cầu khách hàng yêu cầu URL mới - URL bạn đã nói trong RedirectResult. Yêu cầu thứ hai sau đó khác nhau và không chứa các giá trị từ quá trình xử lý trước đó. Hãy thử sử dụng Redirect("/"); hoặc Server.Transfer("/"); để phục vụ tuyến đường mới trong cùng một yêu cầu của khách hàng.

+0

Đó là hành vi sau tôi - tôi muốn khách hàng yêu cầu URL mới. Lý do TempData trống là do sự từ bỏ phiên. – Rob