2011-10-03 26 views
8

Tôi đang làm việc trên ứng dụng web ASP.NET MVC 3, nơi tôi sử dụng TempData để lưu trữ một đối tượng mô hình, trong trường hợp người dùng không đăng nhập.TempData Không được xóa

Đây là luồng:

  1. Sử dụng biểu mẫu gửi.
  2. Mã (bộ lọc hành động đặc biệt) thêm mô hình vào TempData, chuyển hướng đến trang đăng nhập.
  3. tài chuyển hướng trở lại GET hành động, mà đọc TempData và gọi POST hành động trực tiếp

Sau bước 3, tôi sẽ phải suy nghĩ TempData sẽ được xóa?

Dưới đây là các mã:

[HttpGet] 
public ActionResult Foo() 
{ 
    var prefilled = TempData["xxxx"] as MyModel; 
    if (prefilled != null) 
    { 
     return Foo(prefilled); 
    } 
} 

[HttpPost] 
[StatefulAuthorize] // handles the tempdata storage and redirect to logon page 
public ActionResult Foo(MyModel model) 
{ 
    // saves to db.. etc 
} 

tôi thấy this article trong đó nêu:

  1. Items chỉ được lấy ra từ TempData ở phần cuối của một yêu cầu nếu họ đã được gắn thẻ để loại bỏ.
  2. Các mục chỉ được gắn thẻ để xóa khi chúng được đọc.
  3. Các mục có thể không được gắn thẻ bằng cách gọi TempData.Keep (khóa).
  4. Chuyển hướngResult và RedirectToRouteResult luôn gọi TempData.Keep().

Bằng cách đọc nó với TempData["xxx"] không phải là "đã đọc" và do đó chúng phải được gắn thẻ để xóa?

Và điều cuối cùng liên quan đến tôi một chút - vì tôi đang thực hiện Chuyển hướng sau POST (P-R-G). Nhưng điều này không thể tránh được.

Có cách nào tôi có thể nói "bỏ qua mục này" không. TempData.Remove? Hay tôi đang làm điều này sai?

+0

Bạn cần thực hiện chuyển hướng đầy đủ và không trả lại phương thức hành động thứ hai. Đó là lý do tại sao nó không hoạt động. – Buildstarted

+0

@BuildStarted - nhưng phương thức POST * thực hiện * chuyển hướng sau khi hoàn tất. Bạn không thể chuyển hướng đến phương thức POST, đó không phải là GET? – RPM1984

+0

Vâng, từ những gì tôi đọc dựa trên dữ liệu hạn chế là bạn đang thực hiện nhận và chuyển hướng * trong mã * tới bài đăng - rằng 'StatefulAuthorize' sẽ không được gọi. – Buildstarted

Trả lời

9

Cố định bằng cách thêm TempData.Remove ngay sau khi tôi đọc.

Không thực sự hài lòng về điều này. Tôi nghĩ rằng toàn bộ điểm của TempData là tôi không phải làm điều này.

Cũng có thể sử dụng Phiên trực tiếp.

+0

Đó không phải là cách để xóa nó đi. Bạn có thể sử dụng khá nhiều phiên thay vì TempData. Chỉ có lợi thế với TempData là nó tự quản lý dữ liệu. Như tôi đã trả lời trước đó, Giá trị chỉ bị xóa khi Action kết quả bằng 200 (Chẳng hạn như ViewResult/ContentResult/JsonResult) trong tất cả các trường hợp khác, chính xác mọi hành động dẫn đến Mã trạng thái 302 (chẳng hạn như RedirectAction) sẽ giữ lại dữ liệu trong TempData. Đọc qua các thông tin sau để biết thêm chi tiết http://stackoverflow.com/questions/32571599/asp-net-tempdata-isnt-cleared-even-after-reading-it –

6

Có 2 yêu cầu HTTP GET liên quan như:

  1. Các yêu cầu đầu tiên được gửi bởi khách hàng và là một trong những mà các cửa hàng một cái gì đó vào TempData
  2. Vào cuối những yêu cầu đầu tiên cho khách hàng gửi một yêu cầu HTTP thứ hai để tìm nạp trang đăng nhập.

Không có yêu cầu POST nào liên quan đến kịch bản của bạn. Thực tế là từ hành động GET Foo của bạn, bạn đang gọi hành động POST Foo không có nghĩa là có một yêu cầu riêng được thực hiện (bạn vẫn đang ở trong ngữ cảnh của yêu cầu GET ban đầu). Nó chỉ là một cuộc gọi phương thức C#, không phải là một yêu cầu riêng biệt.

Bạn lưu trữ thứ gì đó vào TempData trong yêu cầu đầu tiên và TempData này sẽ có sẵn cho yêu cầu thứ hai. Vì vậy, nó sẽ có sẵn trong hành động điều khiển hiển thị trang đăng nhập.

Vì vậy, bạn phải đọc từ TempData trong hành động hiển thị trang đăng nhập nếu bạn muốn loại bỏ TempData.

+0

Quyền của bạn. Nhưng tôi không quan tâm về nó trên trang đăng nhập. Tôi đang cố gắng thực hiện "đăng tự động" khi họ đăng nhập, vì vậy họ không phải gửi lại biểu mẫu. Đó là lý do tại sao im "gọi" hành động POST của tôi trực tiếp (tôi biết nó không phải là một yêu cầu riêng biệt). Vì vậy, tôi đoán tôi không nên thực sự được sử dụng TempData, vì nó là 2 yêu cầu sau đó mà tôi cần dữ liệu, không phải là tiếp theo. – RPM1984

3

Dưới đây là một số điểm chính cần lưu ý khi sử dụng dữ liệu Nhiệt độ.

1) Quyền truy cập đọc vào dữ liệu tạm thời không xóa các mục khỏi từ điển ngay lập tức mà chỉ xóa các dấu để xóa.

2) Dữ liệu tạm thời sẽ không phải lúc nào cũng xóa mục đã được truy cập. Nó chỉ loại bỏ mục khi một hành động dẫn đến một mã trạng thái Http 200 (ViewResult/JsonResult/ContentResult, v.v.).

3) Trong trường hợp các hành động dẫn đến Http 302 (chẳng hạn như bất kỳ hành động chuyển hướng nào), dữ liệu được giữ lại trong bộ nhớ ngay cả khi nó được truy cập.

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