2013-07-05 44 views
6

Tôi có vấn đề này thực sự kỳ lạ và tôi chắc chắn rằng tôi đang thiếu một cái gì đó hiển nhiên ở đây. Tôi có hai dòng lệnh sau:Thay đổi đối tượng phiên khi đối tượng được cập nhật trong C#

HttpContext.Current.Session[listModelType + "ListModel"] = listModel; 
listModel.ProductRows = new Collection<ProductRow>(listModel.ProductRows.Where(r => r.ParentRowId == 0).ToList()); 

Sau khi dòng thứ hai được thực hiện đối tượng session của tôi được cập nhật cũng như (theo "Watch" trong Visual Studio)

tôi đang thiếu gì ở đây?

Tôi đã thử

int i = 0; 
HttpContext.Current.Session["i"] = i; 
i++; 

và HttpContext.Current.Session [ "i"] vẫn 0.

Trả lời

11

Xem value types and reference types.

int là loại giá trị, do đó sẽ được lưu trữ "nguyên trạng" vào thời điểm chuyển nhượng; listModel là loại tham chiếu để bạn lưu trữ tham chiếu đến đối tượng trong phiên của mình, không phải giá trị của đối tượng.

Bạn sẽ phải tạo một phiên bản mới là listModel nếu bạn muốn một phiên trong phiên của bạn bị ảnh hưởng.

+0

Cảm ơn CodeCaster - sẽ cho phép. Chỉ nghĩ rằng nó luôn luôn là giá trị được lưu trữ. – CJe

+0

quyền của bạn với những gì bạn đã nghĩ, giá trị được lưu trữ trong phiên – rajeemcariazo

4

Trong ví dụ đầu tiên của bạn, bạn đang lưu trữ tham chiếu đến đối tượng (Vị trí bộ nhớ danh sách). Vì vậy, nếu list được cập nhật, nó sẽ phản ánh trong phiên. Đây là kiểu tham chiếu.

Trong ví dụ thứ hai bạn đang sử dụng một loại giá trị:

int i = 0; 
HttpContext.Current.Session["i"] = i; 
i++; 

Bạn khai báo i và đặt nó là 0 (loại giá trị gia tăng)

Bạn lưu trữ giá trị 0 trong phiên. (Không phải là vị trí bộ nhớ của i)

Bạn tăng i nhưng phiên vẫn có giá trị 0

1

Trong ví dụ đầu tiên biến phiên của bạn được trỏ đến một reference để nó được cập nhật vì hai tham chiếu được trỏ đến cùng một giá trị.

Biến phiên thứ hai trỏ đến loại primitive (value) để chúng có các bản sao giá trị riêng biệt.

0

Cách đúng nên là:

int i = 0; 
    i++; 
    HttpContext.Current.Session["i"] = i; 

các HttpContext.Current.Session [ "i"] vẫn 1.

1

Trong ví dụ đầu tiên biến phiên của bạn được trỏ đến một tài liệu tham khảo để nó được cập nhật vì hai tham chiếu trỏ đến cùng một giá trị.

vì vậy trước khi giao đến phiên bạn chuyển đổi nó thành Json và sau đó gán

HttpContext.Current.Session[listModelType + "ListModel"] = JsonConvert.SerializeObject(listModel); 

Lưu ý: JsonConvert là từ tên không gian Newtonsoft.Không gian tên Json trong C#

Trong dòng thứ hai nếu giá trị thay đổi trong đối tượng listModel không phản ánh phiên. nhưng khi bạn muốn truy xuất giá trị từ phiên bạn nên chuyển đổi cho đối tượng dạng Json

if (HttpContext.Current.Session[listModelType + "ListModel"] != null) 
{ 

    listModel = JsonConvert.DeserializeObject<*CLASS name of lsitmodel*>((string)HttpContext.Current.Session[listModelType + "ListModel"]); 

} 
0

Trong ví dụ đầu tiên biến phiên của bạn được trỏ đến một tài liệu tham khảo để nó được cập nhật vì hai tham chiếu được trỏ đến cùng giá trị.

vì vậy trước khi giao đến phiên bạn chuyển đổi nó thành Json và sau đó gán

HttpContext.Current.Session[listModelType + "ListModel"] = JsonConvert.SerializeObject(listModel); 

Lưu ý: JsonConvert là từ tên không gian Newtonsoft.Json namespace trong C#

Trong dòng thứ hai nếu thay đổi giá trị trong listModel đối tượng không phản ánh phiên. nhưng khi bạn muốn truy xuất giá trị từ phiên, bạn nên chuyển đổi thành dạng đối tượng Json

if (HttpContext.Current.Session[listModelType + "ListModel"] != null) { 

     listModel = JsonConvert.DeserializeObject<*CLASS name of lsitmodel*>((string)HttpContext.Current.Session[listModelType + "ListModel"]); 

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