2010-06-21 7 views
8

Tôi có một số biến mà tôi cần gửi từ trang này sang trang khác ... Cách tốt nhất để làm điều này là gì?ASP.NET; Một số biến phiên hoặc "đối tượng vùng chứa"?

Chỉ cần gửi cho họ từng người một:

string var1 = Session["var1"] == null ? "" : Session["var1"].ToString(); 
int var2 = Session["var2"] == null ? 0 : int.Parse(Session["var2"].ToString()); 

và vân vân ...

Hoặc đặt chúng tất cả trong một số loại container đối tượng?

struct SessionData 
{ 
    public int Var1 { get; set; } 
    public string Var2 { get; set; } 
    public int Var3 { get; set; } 
} 

-

SessionData data = Session["data"] as SessionData; 

giải pháp tốt nhất là gì? Bạn dùng gì?

+0

5 câu trả lời trong 5 phút ... Tôi yêu SO: D –

Trả lời

6

Sự kết hợp của hai là cách tiếp cận duy trì nhất. Session cung cấp một cửa hàng cặp khóa-giá trị trở kháng thấp, linh hoạt để tránh lãng phí điều đó. Tuy nhiên, đối với các phần dữ liệu phức tạp là luôn luôn liên quan đến nhau - ví dụ: UserProfile - có ý nghĩa để có đối tượng lồng nhau sâu.

+0

Nhưng tại sao bạn không lưu trữ userID hoặc profileID trong Phiên và sử dụng DB cho phần còn lại của nó? –

+3

Bởi vì sau đó bạn phải chịu chi phí của DB hit mỗi lần, được cho là khu vực mã chậm nhất. – JustLoren

0

Tôi không nghĩ rằng tôi đã từng tạo một đối tượng chỉ để nhóm các đối tượng khác để lưu trữ trong một phiên, vì vậy tôi có thể đi với tùy chọn đầu tiên. Điều đó nói rằng, nếu bạn có một số lượng lớn các đối tượng mà bạn cần để nhóm chúng lại để làm cho nó dễ dàng hơn để làm việc với, bạn có thể muốn kiểm tra lại kiến ​​trúc của bạn.

2

Nếu tất cả các dữ liệu mà bạn đang lưu trữ trong phiên có liên quan, sau đó tôi sẽ đề nghị consolodating nó thành một đối tượng duy nhất giống như ví dụ thứ hai của bạn:

public class UserData 
{ 
    public string UserName { get; set; } 
    public string LastPageViewed { get; set; } 
    public int ParentGroupId { get; set; } 
} 

Và sau đó tải tất cả mọi thứ một lần và lưu trữ nó cho phiên.

Tuy nhiên, tôi sẽ không đề xuất gói dữ liệu Phiên không liên quan vào một đối tượng duy nhất. Tôi sẽ chia từng nhóm riêng biệt của các mặt hàng liên quan thành của riêng họ. Kết quả sẽ là một cái gì đó của một trung gian giữa hai cách tiếp cận cứng nhắc mà bạn cung cấp.

0

Tôi đã sử dụng cả hai. Nói chung, nhiều tên biến phiên dẫn đến khả năng xảy ra xung đột, điều này làm cho các bộ sưu tập trở nên đáng tin cậy hơn. Đảm bảo rằng nội dung của bộ sưu tập có liên quan đến một trách nhiệm duy nhất, giống như đối với bất kỳ đối tượng nào. (Trong thực tế, các đối tượng kinh doanh làm cho các ứng cử viên xuất sắc cho các đối tượng session.)

Hai lời khuyên:

Xác định tất cả các tên phiên như biến readonly tĩnh nào, và làm cho nó một tiêu chuẩn mã hóa để chỉ sử dụng các biến tĩnh khi đặt tên phiên dữ liệu.

Thứ hai, hãy đảm bảo rằng mọi đối tượng đều được đánh dấu bằng thuộc tính [Serializable]. Nếu bạn cần lưu trạng thái phiên, quá trình này là rất cần thiết.

1

tôi sử dụng một SessionHandler, mà là một lớp tùy chỉnh cuộn trông như thế này

public static class SessionHandler 
{ 
    public static string UserId 
    { 
     get 
     { 
      return Session["UserId"]; 
     } 
     set 
     { 
      Session["UserId"] = value; 
     } 
    }  
} 

Và sau đó trong mã tôi làm

var user = myDataContext.Users.Where(u => u.UserId = SessionHandler.UserId).FirstOrDefault(); 
+0

Nếu bạn đang sử dụng phương pháp này, hãy chắc chắn để làm cho nó rõ ràng rằng dữ liệu đang được giữ trong phiên. Nếu không, đối với người tiêu dùng khác của lớp, hành vi sẽ có vẻ lạ khi Phiên được xóa. –

+1

Hy vọng rằng tên * Phiên * Trình xử lý xóa quyền đó;) – JustLoren

0

Các cộng lớn của một đối tượng: các thuộc tính là strongly- đã nhập.