2010-03-26 38 views
5

Trên trang của tôi, tôi có n-userControl (cùng kiểm soát) Tôi cần liên lạc giữa chúng (để cụ thể hơn, tôi cần truyền một giá trị).Chia sẻ dữ liệu giữa các liên kết người dùng

Tôi không muốn liên quan đến trang lưu trữ cho điều đó.

Các điều khiển hoạt động như "máy nhắn tin" và tương tác với dữ liệu được phân trang trên trang lưu trữ thông qua các sự kiện mà trang lưu trữ được đăng ký.
Vì vậy, khi người dùng nhấp vào một trong các máy nhắn tin và thay đổi trạng thái của nó, điều khiển khác nên biết về nó và thay đổi chính nó cho phù hợp.

Tôi không thể sử dụng VieState bởi vì ViewState là trên mỗi kiểm soát và do đó là controlstate.

Tôi có thể sử dụng Phiên cho điều đó không? (phiên được chia sẻ và chỉ có một giá trị mà tôi cần để lưu trữ)

Hoặc có thể có điều gì đó tốt hơn tôi có thể sử dụng? (không có QueryString)

Trả lời

1

Cá nhân không có cách "dễ dàng" để thực hiện việc này mà không thực hiện việc này thông qua trang điều khiển hoặc sự kiện.

Từ những gì bạn đang nói những gì tôi sẽ hình dung sẽ là một cái gì đó như thế này. Giả sử hai điều khiển A và B là các điều khiển máy nhắn tin của bạn.

Trang chứa đăng ký sự kiện "PageSelectionChanged" trên cả hai điều khiển, để phản hồi sự kiện đó cập nhật dữ liệu mà bạn đã có và nó liệt kê tất cả các điều khiển máy nhắn tin thiết lập giá trị "Trang hiện tại".

Bạn đã có đường ống dẫn sự kiện tại chỗ để liên lạc từ điều khiển -> trang, sử dụng những gì bạn đã tạo.

Tại sao không phiên?

Tôi đã được hỏi trong phần nhận xét nếu điều này tốt hơn phiên và câu trả lời là có, vì một số lý do.

  1. thông tin phiên làm việc, trừ khi rõ ràng dọn dẹp tồn tại trong suốt thời gian của một phiên người dùng (thường là 20 phút)
  2. becase của số 1, bạn sẽ cần phải thêm các mục vào trang, cho if (! IsPostBack) để "xóa" các biến phiên để người dùng không bắt đầu trên một trang khác.
  3. Tăng trưởng ứng dụng trong tương lai, thông tin phiên phải được chuyển ra khỏi quá trình đến SQL Server hoặc làm việc khác trong môi trường trang trại, vì điều này tôi cũng cố gắng tránh nó.
  4. Sử dụng phiên lưu trữ thông tin này trong bộ nhớ trên máy chủ web, mặc dù nhỏ (4 byte nếu số nguyên) có thể thêm và không cần thiết
  5. Tùy thuộc vào bản chất của bản cập nhật, bạn không thể đảm bảo thứ tự kiểm soát với phiên để đảm bảo rằng 1 điều khiển buộc cập nhật cho tất cả các điều khiển.

Có các giải pháp khác, giải pháp tương tự như giải pháp được đăng ở trên, có thể xem lại trang, nhưng bạn phải cẩn thận với điều đó để đảm bảo bạn không tham gia vào tình huống đệ quy Ngoài ra, nếu bạn có nhiều điều khiển trên trang, nó có thể thêm rất nhiều chi phí để liên tục lặp qua tất cả mọi thứ.

+0

có điều này sẽ hiệu quả, nhưng điều này yêu cầu thêm mã mà tôi cần thêm vào trang lưu trữ (ngay bây giờ, bên cạnh sự kiện đăng ký trang lưu trữ không tương tác với điều khiển), nó sẽ requre để vòng qua điều khiển và tìm chúng trên trang. Có tốt hơn sau đó tiết kiệm onre số nguyên phiên phiên vì vậy cả hai điều khiển có thể đọc nó? – toraan

+0

Có, hãy xem bản cập nhật của tôi cho bài đăng này là tại sao (Đã quá lâu để nhận xét) –

+0

để loop cho usercontrols trong trang lưu trữ (tôi cần phải tìm tất cả các điều khiển người dùng trên trang của tôi) là lựa chọn tốt nhất trong kịch bản của tôi? – toraan

0

Trang vùng chứa có thuộc tính trong chế độ xem có lưu trữ trạng thái.Khi người dùng nhấp vào một trong các máy nhắn tin, nó sẽ tạo ra một sự kiện được xử lý bởi trang vùng chứa. Điều này sau đó lặp qua các điều khiển n người dùng và gọi một phương thức công khai trên các điều khiển đó.

0

Bạn có thể tạo phiên bản sửa đổi nhanh của Mẫu quan sát viên. Tôi sẽ đề nghị xây dựng một kiểm soát manger trên các trang. Nhưng nếu bạn không muốn sửa đổi trang, đây là giải pháp nhanh.

Bạn có thể tạo phương thức tĩnh sẽ thông báo cho tất cả các loại điều khiển tương tự. Bằng cách gọi phương thức cập nhật của họ. Vui lòng chuyển những dữ liệu bạn cần.

protected void control_event(object sender, EventArgs e) 
{ 
    UpdateAllControls(page); 
} 


public static void UpdateAllControls(Control parent /* can be Page */) 
     { 
      foreach (Control c in parent.Controls) 
      { 
       if (c.GetType() == this.GetType()) 
        ((MyType)).Update() 
       if (c.HasControls()) 
        controls = GetAllControls(controls, t, c); 
      } 
     } 
+0

Giải pháp này sẽ làm việc, tuy nhiên, tôi sẽ cảnh báo chống lại đệ quy, nếu không cần thiết. nếu bạn có nhiều điều khiển thì đây có thể là một quá trình tốn kém. Nếu các điều khiển người dùng luôn được thêm vào trang, bỏ qua phần đệ quy của quy trình. –

+0

Giả sử bạn không có kiến ​​thức về cách thiết lập trang. Và có, tôi đồng ý, đó là một phương pháp chậm. Đăng ký mỗi điều khiển với một Observer sẽ là giải pháp tốt nhất. – Glennular

+0

Cách mã ở trên khác với người quan sát? – toraan

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