2010-02-04 33 views
22

Tôi đang phát triển một ứng dụng ASP.NET với C# và Ajax.Chuyển dữ liệu từ trang ASP.NET tới các điều khiển người dùng ASCX được nạp động

Tôi có một trang chứa các điều khiển người dùng được tải động. Tôi cần phải chuyển một số dữ liệu (giá trị số nguyên và một số chuỗi) cho điều khiển người dùng đã được tải động.

Bây giờ tôi sử dụng Phiên để chuyển các giá trị này, nhưng tôi nghĩ tôi có thể sử dụng một cách khác; một cái gì đó như VIEWSTATE hoặc đầu vào bị ẩn.

Bạn khuyên tôi nên làm gì?

UPDATE:

Thực tế là tôi nạp điều khiển tự động là rất quan trọng bởi vì điều khiển được nạp vào mỗi postback, và tôi không thể lưu trữ bất kỳ giá trị trên điều khiển.

Trả lời

39

Tạo thuộc tính trên điều khiển người dùng của bạn với kiểu dữ liệu bạn muốn chuyển đến và điền vào trang của bạn trong quá trình tạo điều khiển.

public class myControl : Control 
{ 
    ... 
    public int myIntValue {get; set;} 
    ... 
} 

Trong đoạn mã sau:

myControl ctrl = new myControl(); 
ctrl.myIntValue = 5; 

Bạn cũng có thể làm điều này trực tiếp trong lập trình: thuộc tính

<uc1:myControl ID="uc1" runat="server" myIntValue="5" /> 
+0

Đây là câu trả lời tuyệt vời nhưng tôi không thể sử dụng vì điều khiển được tải động. Có lẽ tôi sẽ sử dụng các lĩnh vực ẩn. Cảm ơn bạn. – VansFannel

+2

Bạn nên sử dụng ViewState để giữ trạng thái điều khiển. – Oded

+1

Và làm cách nào tôi có thể giữ các giá trị của biểu tình công khai trên ViewState? Tôi đang cố gắng làm điều đó, nhưng myIntValue luôn bằng không. – VansFannel

10

cài đặt nào trong vòng kiểm soát người dùng của bạn.

public string TestValue { get;set;}; 

Và sau đó khi bạn đặt điều khiển người dùng của bạn trong trang aspx của bạn:

<uc1:UserControl ID="uc1" runat="server" TestValue="Testing" /> 

Bạn cũng có thể thay đổi các giá trị trong mã của bạn đằng sau:

uc1.testValue = "some value"; 
+0

Đây là một câu trả lời tuyệt vời nhưng tôi không thể sử dụng nó vì các điều khiển được nạp tự động. Có lẽ tôi sẽ sử dụng các lĩnh vực ẩn. Cảm ơn bạn. – VansFannel

0

Loại đánh bại mục đích sử dụng một điều khiển ascx IMO vì điều này phá vỡ sự đóng gói kiểm soát. Trang của bạn nên được -getting- dữ liệu từ kiểm soát thông qua đăng ký các sự kiện được xuất bản bởi kiểm soát.

+0

Tôi cần chuyển dữ liệu từ PAGE đến CONTROL. – VansFannel

+1

Làm thế nào điều này phá vỡ đóng gói? –

3

Để thực sự trả lời câu hỏi của bạn, nhiều như mọi người khác dường như không muốn bạn làm điều này, và tôi đồng ý ... Tôi đã làm điều này trước đây.

Điều đầu tiên tôi muốn làm là làm cho trang của bạn triển khai giao diện.

Trong kiểm soát:

IVansFannelDataProviderPage provider = this.Page as IVansFannelDataProviderPage; if (provider != null) { //grab data from interface } else throw YouCantPutThisControlOnThisKindOfPageException();

Nó không phải là cách thanh lịch nhất để làm điều đó, nhưng khi chúng ta đã có rất nhiều điều khiển muốn chia sẻ một đối tượng rất tốn kém này phù hợp với những hóa đơn.

Tính năng này hoạt động tốt nhưng điều khiển của bạn không thể sử dụng được trên các trang không triển khai giao diện - điều đó làm cho các điều khiển được kết hợp chặt chẽ với trang của bạn. Mọi người khác nói rằng để trang có được dữ liệu từ các điều khiển là chính xác; bạn đặt các điều khiển trên trang, chứ không phải các trang trong các điều khiển.

Bạn nên có lý do rất tốt để làm điều đó. Đối với chúng tôi: tải của đối tượng được chia sẻ là rất tốn kém, và có tải trang/lưu nó không có vấn đề gì kiểm soát được làm việc trên đối tượng đó là khá hữu ích. Thật quá tệ khi nhiều trang không thực sự triển khai giao diện phải được trang trí để cung cấp một số loại hỗ trợ hoặc hỗ trợ proxy chỉ để có được các điều khiển hoạt động, và làm cho các trang và kiểm soát nhiều ít sử dụng lại được.

Nếu tôi phải làm điều này một lần nữa, tôi muốn trang gửi dữ liệu đến các điều khiển có sự kiện, có lẽ thông qua phản ánh nếu tôi cần phải lười biếng.

+0

Và điều gì về việc sử dụng các thuộc tính công khai trên các điều khiển của người dùng? – VansFannel

+0

Điều đó sẽ hiệu quả. Các sự kiện hoặc tài sản công cộng là khá giống nhau * về mặt khớp nối. * – Broam

+0

Tôi rất tiếc, nhưng nếu tôi tải các điều khiển động thì tôi không thể sử dụng các thuộc tính công khai. – VansFannel

0

Bạn có thể đặt giá trị trong bộ sưu tập HttpContext.Items và đọc chúng trong điều khiển của bạn. Điều này cũng giống như sử dụng Phiên trừ khi nó chỉ có sẵn cho mỗi yêu cầu không phải cho toàn bộ thời gian của phiên.

http://www.4guysfromrolla.com/articles/060904-1.aspx

IMHO này là một chút lười biếng nhưng nó có thể là một giải pháp tốt trong một số tình huống.

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