2011-09-23 23 views
5

Tôi có một bộ điều khiển sẽ logic đó tìm kiếm một: giá trị phiênMVC 3 Session.Abandon() được gọi trước khi thiết lập một TempData [ "myValue"] = "foo" gây ra bộ điều khiển bên cạnh có TempData như là null

//checks value null etc.. for existing record in session memory. 
Session["certnum"] 

Sau đó, trong bộ điều khiển tôi đã quyết định phải có một điều kiện mà:

//is called to initiate a New Record that will be created. 
Session.Abandon(); 

Tuy nhiên trong mã hóa thủ tục là Session.Abandon(); đến trước khi tạo TempData ["myobject"] = "foo", và khi bước qua mã, TempData trong cửa sổ ngay lập tức cho thấy giá trị của tôi và tất cả đều có vẻ tốt. Sau đó, khi chuyển hướng đến một trình điều khiển khác:

return RedirectToAction("ChildInfo", "NewRecord"); 

Phương thức ChildInfo này không còn giá trị TempData ... Bây giờ nó không có giá trị. Phương pháp bỏ phiên được gọi là cách trước khi giá trị TempData được thiết lập, không chắc chắn đây có phải là lỗi với Phiên MVC hay không, nhưng điều đó không có ý nghĩa với tôi. Nếu tôi đang tạo một phiên bản lighweight mới TempData, thì nó sẽ tiếp tục tồn tại với bộ điều khiển tiếp theo. Nếu tôi loại bỏ phương thức Session.Abandon() thì giá trị TempData vẫn hoạt động như trước đây.

+0

Điều quan trọng ở đây là TempData dựa vào phiên. Phiên làm việc đã biến mất do đó TempData đã biến mất. –

+0

@Adam Có tôi nhận ra rằng tuy nhiên tôi đang gọi Session.Abandon() trước khi tạo ra một giá trị TempData, tôi đang trong cùng một phương pháp actionresult của một bộ điều khiển, nhưng vẫn còn, mà dường như chỉ điên với tôi. –

+0

tại sao nó sẽ phát điên? bạn đang đặt lại một đối tượng cần thiết cho tempdata. Thats như nói "Tôi xóa tất cả các hàng trong bảng, nhưng tôi không hiểu tại sao trên yêu cầu tiếp theo hàng tôi sẽ yêu cầu không có?" :) –

Trả lời

11

Phương thức Session.Abandon() xóa phiên hiện tại ở cuối yêu cầu, rằng nó được thiết kế để làm gì.

Xem http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.abandon.aspx

Nếu bạn muốn chuyển hướng đến một hành động khác nhau, bạn không cần phải gọi chuyển hướng giống như bạn đã làm. Nếu bạn sử dụng Abandon() yêu cầu sẽ nhận được id phiên mới.

Nếu bạn muốn loại bỏ một cái gì đó từ một phiên bạn cần phải sử dụng Session.Remove hoặc Session.RemoveAll phương pháp (Cũng Clear có thể được sử dụng để làm tương tự như RemoveAll này sẽ được thực hiện bằng cách:.

Session.Remove(itemToRemove); 

hoặc

Session.RemoveAll() 

Bằng cách sử dụng một trong hai tùy chọn này, bạn có thể xóa một số hoặc tất cả dữ liệu đã lưu trước đó khỏi phiên mà không làm cho id phiên được tạo lại theo yêu cầu tiếp theo.

+0

Cảm ơn bạn Bernie! –

1

Phương thức Session.Abandon không xóa đối tượng phiên, nó chỉ gắn cờ là không được giữ. Đối tượng phiên vẫn còn nguyên trong yêu cầu hiện tại.

Khi phản hồi hoàn tất, đối tượng phiên bị hủy, để lần sau trình duyệt đưa ra yêu cầu, máy chủ phải thiết lập đối tượng phiên mới. Bất cứ điều gì mà bạn đặt trong đối tượng phiên trong toàn bộ yêu cầu đó sẽ biến mất khi đối tượng phiên bị bỏ qua.

Khi bạn thực hiện chuyển hướng, trang chuyển hướng được gửi dưới dạng phản hồi cho trình duyệt, sau đó yêu cầu trang mới. Nếu bạn đánh dấu đối tượng phiên bị hủy và sau đó thực hiện chuyển hướng, trang mới sẽ nhận đối tượng phiên mới.

+0

Tôi hiểu ngay bây giờ. Cảm ơn Guffa. –

0

Đây là cách hoạt động của nó.

Session.Abandon không giết phiên ngay lập tức. Nó kéo dài cho đến cuối trang. Sau đó, khi tải trang tiếp theo, một phiên mới được tạo.

+0

Cảm ơn! Tôi đánh giá cao nó –

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