2012-05-27 28 views
9

Tôi đã cố gắng làm cho một trang web dưới dạng phiên ít hơn. Vì vậy, hãy thêm <sessionState mode="Off" /> vào web.config của tôi. Sau đó, nếu tôi thực thiSử dụng TempData trong khi <sessionState mode = "Off" />

Session["test"] = "yes"; 

Tôi gặp lỗi "Tham chiếu đối tượng không được đặt thành thể hiện của đối tượng. ”Điều này là tốt.

Nhưng với cấu hình này tôi có thể thiết

TempData["test"] = "yes"; 

trong điều khiển và in TempData["test"]; trong Xem trang. Nó hoạt động tốt.

Theo MSDN “Giá trị thuộc tính TempData được lưu trữ trong trạng thái phiên”.

Vì vậy, nếu tôi đề cập đến <sessionState mode="Off" /> thì TempData hoạt động như thế nào? ASP.NET vẫn lưu trữ TempData trong phiên làm việc hay ở một nơi khác?

Trả lời

16

Điều này chỉ có thể hoạt động với trạng thái phiên bị tắt nếu bạn đang in TempData["test"] trên Chế độ xem trong cùng một yêu cầu - do đó giá trị này bị xóa khỏi từ điển TempData và MVC không cố gắng lưu nó vào trạng thái phiên. Cố gắng loại bỏ nó khỏi tầm nhìn của bạn và bạn sẽ nhận được System.InvalidOperationException: The SessionStateTempDataProvider class requires session state to be enabled.

Bạn cá nhân có thể vô hiệu hóa trạng thái phiên cho bộ điều khiển của bạn bằng cách thêm [SessionState(SessionStateBehavior.Disabled)] thuộc tính hoặc thực hiện cung cấp dịch vụ TempData của riêng bạn sử dụng giao diện ITempDataProvider.

[EDIT] Chỉ cần để giải thích điểm đầu tiên của tôi, chúng ta hãy tưởng tượng hai tình huống:

  • Bạn có hành động điều khiển gán một số giá trị để TempData["test"] và một cái nhìn tương ứng đang được trở về từ hành động này và in dữ liệu này . Trong trường hợp này mọi thứ sẽ hoạt động ngay cả khi không có trạng thái phiên vì không cần lưu trữ TempData["test"] giữa các yêu cầu.
  • Bạn có hành động điều khiển gán một số giá trị cho TempData["test"] nhưng chuyển hướng người dùng đến một hành động khác với chế độ xem riêng của nó để in dữ liệu này. Trong trường hợp này, nó sẽ không hoạt động với trạng thái phiên bị vô hiệu hóa vì MVC cần lưu trữ giá trị TempData["test"] của bạn giữa hai yêu cầu.
+0

Tôi hiểu về ITempDataProvider và cảm ơn vì điều đó. Tôi cũng thấy rằng thay vì phiên bạn có thể giữ dữ liệu tạm thời trong cookie từ đây. http://afana.me/post/session-less-controllers-and-TempData-ASPNET-MVC.aspx. –

+0

Có, anh chàng đã triển khai nhà cung cấp TempData của riêng mình dựa trên cookie. –

+0

Chúng tôi sử dụng TempData cho yêu cầu duy nhất phải không? Vì vậy, chúng tôi đặt giá trị cho TempData trong bộ điều khiển và vào trang Xem. Tôi có một nghi ngờ còn lại về "Hãy thử để loại bỏ nó khỏi tầm nhìn của bạn và bạn sẽ nhận được lỗi". Bạn có thể giải thích điều đó không? –

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