2013-02-15 37 views
9

Trong ASP.NET MVC 2, tuổi thọ của một mục nhập trong TempDataDictionary chỉ là một Yêu cầu HTTP.Thay đổi thực hiện TempData - Lý do thay đổi

Điều đó được dịch để đặt giá trị trong một yêu cầu, chuyển hướng và có quyền truy cập vào cùng một mục ở đầu bên kia của dòng. Sau này, mục nhập sẽ không còn nữa, bất kể bạn có đọc giá trị của từ điển ở cuối dòng sau hay không.

Kể từ ASP.NET MVC 3 (Tôi tin), chi tiết triển khai này đã thay đổi khá đáng kể.

Các mục nhập trong TempDataDictionary hiện chỉ được xóa sau khi chúng đã được đọc.

MVC 4

public object this[string key] 
    { 
     get 
     { 
     object obj; 
     if (!this.TryGetValue(key, out obj)) 
      return (object) null; 
     this._initialKeys.Remove(key); 
     return obj; 
     } 
    } 

public bool TryGetValue(string key, out object value) 
    { 
     this._initialKeys.Remove(key); 
     return this._data.TryGetValue(key, out value); 
    } 

MVC 2:

public object this[string key] { 
      get { 
       object value; 
       if (TryGetValue(key, out value)) { 
        return value; 
       } 
       return null; 
      } 

public bool TryGetValue(string key, out object value) { 
      return _data.TryGetValue(key, out value); 
     } 

Vì hầu hết mọi người dường như đặt các mục trong bộ sưu tập TempData trong một yêu cầu và ngay lập tức đọc chúng trở lại trong yêu cầu tiếp theo ngay lập tức, chức năng này dường như giống nhau.

Trong trường hợp không phải là trường hợp muốn đọc mục nhập TempData nếu được chuyển đến một nơi và mong muốn nó bị xóa nếu yêu cầu các tài nguyên khác và điều hướng trở lại, thay đổi này có tác động khá lớn.

Không còn là mục nhập có sẵn cho một yêu cầu http nhưng có sẵn trên nhiều yêu cầu HTTP, chỉ có sẵn cho một lần nhận trên từ điển.

Tôi muốn biết thêm về sự thay đổi này, lý do cho sự thay đổi này là gì để phục vụ cho nhiều chuyển hướng hoặc có lợi ích sâu hơn?

Thứ hai, tôi tò mò muốn biết liệu có bất kỳ thứ gì được tích hợp sẵn để chia sẻ dữ liệu yêu cầu HTTP theo cùng cách mà TempData sử dụng để phục vụ không?

+0

Tại sao không sao chép MVC2 'TempData' vào triển khai của riêng bạn? –

+0

Về cơ bản chúng tôi có. –

Trả lời

6

Bạn đang đúng khi cho rằng TempData phím chỉ được xóa nếu họ đã được đọc (hoặc sau khi phiên làm việc của người dùng hết hạn) nhưng điều này đã được các trường hợp kể từ MVC2, (http://forums.asp.net/post/3692286.aspx)

Tôi muốn để biết thêm về sự thay đổi này, những lý do cho sự thay đổi này là gì, điều này có đơn giản là để phục vụ cho nhiều chuyển hướng hoặc có những lợi ích sâu sắc hơn không?

Thay đổi này đã ngăn các sự cố phát sinh trong MVC 1, chẳng hạn như TempData phím bị xóa trước khi chúng được đọc. Vì vậy, có, lợi ích chính là tránh những vấn đề này khi bạn có nhiều lần chuyển hướng lại hoặc yêu cầu xen kẽ.Ngoài ra, các phương thức RedirectToRouteResult hoặc RedirectResult giờ đây tự động gọi số TempData.Keep() để ngăn việc xóa chìa khóa, ngay cả sau khi chúng đã được đọc, do đó hãy ghi nhớ điều đó.

Trong kịch bản nơi đây không phải là trường hợp như muốn đọc TempData nhập nếu chuyển đến một nơi, và hy vọng nó có được gỡ bỏ nếu yêu cầu các nguồn lực khác và điều hướng trở lại, thay đổi này có khá tác động.

Bạn đã chính xác, nếu bạn đã mã hóa với giả định rằng các phím TempData sẽ tự động bị xóa, bạn có thể gặp sự cố không mong muốn. Bạn có thể gọi TempData.Clear() để xóa tất cả các khóa theo cách thủ công khỏi TempDataDictionary hoặc TempData.Remove(key) để xóa khóa cụ thể. Bạn cũng có thể sử dụng TempData.Peek() để đọc giá trị của khóa TempData mà không gắn cờ để xóa khỏi số TempDataDictionary.

Secondary đó, tôi tò mò để biết nếu có bất cứ điều gì được xây dựng trong mà bây giờ phục vụ cho đơn HTTP chia sẻ theo yêu cầu của dữ liệu trong cùng một cách mà TempData sử dụng để phục vụ cho?

Tôi không biết về bất kỳ đối tượng hoặc chức năng mới nào sao chép bản gốc của TempData. Về cơ bản chúng tôi vẫn sử dụng TempData nhưng phải lưu ý rằng dữ liệu vẫn tồn tại cho đến khi đọc và xóa từ điển theo cách thủ công nếu cần.

+0

Cảm ơn Jack. Rất hữu ích. –

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