2012-10-11 40 views
5

Tôi đã đọc bài viết này của Microsoft về quản lý nhà nước.Lưu trữ dữ liệu trong ViewState

http://msdn.microsoft.com/en-us/library/75x4ha6s(v=vs.100).aspx

Tôi tìm thấy một điều thú vị ở đây. ViewState được phân loại là tùy chọn Client Side (Mặc dù tôi đã biết điều đó). Nó nhắc tôi về mã của chúng tôi trong ứng dụng.

DataTable dt = getDatatableFromDB(); 
ViewState["dataTable"] = dt; 

Và mã này hiện đang hoạt động tốt.

nhầm lẫn của tôi là:

  1. Làm thế nào một đối tượng phía khách hàng (ViewState) có thể tiết kiệm đối tượng Server side (DataTable)?
  2. Thực tiễn tốt là sử dụng ViewState để lưu trữ các đối tượng lớn như Datatables?
  3. Điều gì có thể là tác dụng phụ (nếu có) nếu chúng ta tiếp tục sử dụng phương pháp này?
+5

Người bỏ phiếu - nếu bạn không để lại nhận xét, OP sẽ không bao giờ tìm hiểu cách đặt câu hỏi hay hơn. Cá nhân, tôi thấy không có vấn đề với câu hỏi này. Tôi tin rằng nó rất hữu ích cho cộng đồng, vì vậy tôi đang thêm +1 để cân bằng mọi thứ. – JDB

+1

@ Cyborgx37 Thế giới là một nơi tốt hơn để sống vì những người như bạn. Tôi khá mới mẻ với công nghệ này và tôi đang cố gắng tìm hiểu và loại bỏ những nhầm lẫn của mình. Đó là lý do tại sao tôi hỏi những câu hỏi như thế này. Nhưng một số Downvoters nghĩ rằng những gì được biết đến với họ được mọi người biết và không ai nên hỏi những câu hỏi đó. Nó nhắc tôi một câu tục ngữ Trung Quốc "Người hỏi một câu hỏi là một kẻ ngốc trong năm phút, người không hỏi một câu hỏi vẫn là một kẻ ngốc mãi mãi". Lolz –

+0

Cảm ơn, nhưng thực sự là một tiêu chuẩn để đánh giá các câu hỏi hay/xấu - nghĩa là không phải tất cả các câu hỏi trên StackOverflow đều được chào đón (xem http://stackoverflow.com/questions/how-to-ask). Tôi chỉ không thấy vấn đề với bạn. – JDB

Trả lời

8

Chế độ xem được lưu trữ trong thẻ ẩn <input /> trên biểu mẫu. Khi người dùng bắt đầu một postback (bằng cách nhấn vào một nút, ví dụ), dữ liệu được trả về cho máy chủ như là một phần của dữ liệu biểu mẫu.

Nếu bạn lưu trữ lượng lớn dữ liệu trong ViewState, bạn sẽ bị phạt cả khi người dùng cố tải xuống trang (vì tất cả dữ liệu đó sẽ là một phần của HTML) và khi người dùng cố gắng gửi biểu mẫu (vì tất cả dữ liệu đó phải được tải lên máy chủ).

Ngoài ra, ViewState dễ bị mất. Nó chỉ được duy trì miễn là người dùng gửi biểu mẫu. Nếu người dùng nhấp vào một siêu liên kết đến một trang khác, biểu mẫu sẽ không bao giờ được gửi và tất cả dữ liệu chứa trong ViewState sẽ bị mất. Điều này đúng ngay cả khi thẻ neo trỏ trở lại trang mà người dùng hiện đang truy cập.

Tôi thấy từ số previous question của bạn rằng bạn đang cố gắng tìm một nơi tốt để đặt DataTables của mình. ViewState không phải là nơi tồi tệ nhất miễn là dữ liệu tương đối nhỏ. Base64 là tốt hơn so với XML về sử dụng bộ nhớ nhưng nó vẫn còn là một chặng đường dài từ hiệu quả. Nếu dữ liệu khá tĩnh, bạn có thể cân nhắc lưu trữ dữ liệu trong số ApplicationState. Nếu bạn đang chỉnh sửa DataTable với GridView, thì GridView thực sự đã lưu trữ DataTable cho bạn mà bạn có thể truy cập thông qua thuộc tính DataSource (chỉ cần đưa nó trở lại một DataTable).


Nó cũng đáng chú ý là trong khi dữ liệu ViewState được mã hóa trong base64 (có nghĩa là người dùng bình thường sẽ không thể hiểu được nó), nó có thể dễ dàng thay đổi nội dung bởi một người dùng xác định. Dường như dữ liệu vô hại có thể được chỉnh sửa để trở nên khá có hại cho trang web của bạn. Đây là một con đường cổ điển để hack một trang web, vì vậy bạn phải rất cẩn thận về những dữ liệu, chính xác, bạn đang lưu trữ. Ví dụ: nếu bạn lưu trữ ID của người dùng trong ViewState, người dùng có thể chỉnh sửa ID và xâm nhập vào tài khoản của người dùng khác. (Lưu ý: đây chỉ là một vấn đề nếu EnableViewStateMac đã được thiết lập để False.)

+1

Lưu ý phụ: Nó được nối tiếp vào giá trị đầu vào và được deserialized trên đường trở về. –

+0

@ Cyborgx37, Sẽ bật trợ giúp ViewStateMAC trong trường hợp chỉnh sửa ViewState? –

+1

Có, 'EnableViewStateMac' sẽ đi một chặng đường dài để ngăn chặn việc hack ViewState. – JDB

4

1) Làm thế nào một đối tượng phía khách hàng (ViewState) có thể tiết kiệm đối tượng Server side (DataTable)?

Nó được tuần tự hóa.

2) Có thực tiễn tốt để sử dụng ViewState để lưu trữ các đối tượng lớn như Datatables không?

Tùy thuộc vào môi trường và yêu cầu của bạn.

3) Điều gì có thể là tác dụng phụ (nếu có) nếu chúng ta tiếp tục sử dụng phương pháp này?

Rất nhiều dữ liệu sẽ được chuyển qua dây. Nó có thể làm chậm mọi thứ.

+3

Một lưu ý khác: Việc tuần tự hóa một đối tượng lớn cũng sẽ làm cho nó chậm lại .. không chỉ chuyển khoản. –

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