2009-11-20 10 views
6

Trong ứng dụng ASP.NET của tôi, tôi đang tải một ascx động sử dụng LoadControl, sử dụng mô hình sau:ViewState của ascx mất giữa postbacks

var ctrl = LoadControl("/path/to/control.ascx"); 
((ControlType)ctrl).SomeProperty = someData; 
placeholder.Controls.Add(ctrl); 

Việc kiểm soát mà tôi thêm tiết kiệm giá trị tài sản SomeProperty trực tiếp đến ViewState, như sau:

public int? SomeProperty 
{ 
    get { return (int?)ViewState["SomeProperty"]; } 
    set { ViewState["SomeProperty"] = value; } 
} 

Sau đó, kiểm soát ascx sống một mình và tất cả đều tốt cho đến khi xảy ra postback. Khi trang đăng lại, đột nhiên trạng thái xem trống! Tôi nghi ngờ điều này xảy ra bởi vì tôi thao tác ViewState trước khi tôi thêm ascx instantiated vào trang của tôi. Ngoài ra, tôi có thể ngăn chặn các ViewState khỏi bị mất bằng cách thêm dòng sau trong phương pháp Page_Load() kiểm soát ascx của tôi:

SomeProperty = SomeProperty; 

tôi phải làm các việc trên cho mỗi và mọi tài sản để đảm bảo rằng các ViewState được bảo tồn. Bây giờ, có cách nào đẹp hơn để làm việc này không? Thao tác ViewState sau khi tạo .ascx đã được thêm vào trang không phải là một tùy chọn - tôi cần nội dung của ViewState trong các phương thức Page_Init()Page_Load(), được kích hoạt ngay khi tôi thêm .ascx vào trang của mình.

Cảm ơn.

+0

Tôi gặp phải vấn đề tương tự một lần và trong trường hợp của tôi, vấn đề là trong bảng dữ liệu toàn thời gian, chúng tôi đặt tất cả các điều khiển để không sử dụng viewstate. Quan điểm của tôi là việc thêm các điều khiển tự động có thể không phải là vấn đề, nhưng những nơi ẩn mà viewstate được đặt là vô hiệu hóa. –

Trả lời

13

. Hãy nhìn vào các ASP.NET Page Life CycleUnderstanding View State. Xem trạng thái được tải sau khi khởi chạy, do đó bạn sẽ không thể truy cập vào trạng thái trong Page_Init. Bạn nên sử dụng một lĩnh vực ẩn.

Nếu bạn đã chết khi sử dụng Chế độ xem, sớm nhất bạn có thể nhận được bằng cách ghi đè phương pháp LoadViewState (Nhớ gọi base.LoadViewState trước khi thử truy cập).

+0

+1 tài liệu tham khảo tốt w/giải thích –

+0

Cảm ơn, đã xóa nó. Bây giờ tôi đang gặp khó khăn: tôi cần phải tạo một số điều khiển trong Page_Init, tùy thuộc vào nội dung của trạng thái xem (hoặc trường ẩn, cho vấn đề đó, dường như không được tải trong Page_Init). –

+0

Ohh nếu bạn đi với cách tiếp cận trường ẩn, bạn sẽ cần phải tìm trong 'Request.Forms' cho giá trị. Kiểm soát máy chủ thực tế sẽ không được tải. Hãy thử một lần. – Bob

1

Theo dõi các ID của UserControl trước khi postback sau đó trên postback tái tạo sự kiểm soát và gán ID trở lại và nó sẽ tự động tải các ViewState trở lại trong

+0

Ồ, vâng, tôi quên nói điều đó. Tôi thực sự tạo lại điều khiển người dùng trên mỗi lần đăng lại và tôi đảm bảo rằng ID giống nhau mỗi lần. Vấn đề không phải là ViewState không thể được phục hồi, đó là những thay đổi để ViewState giữa LoadControl và placeHolder.Controls.Add không tồn tại trừ khi tôi lặp lại một cách rõ ràng các thay đổi sau khi điều khiển đã được thêm vào trang. –

3

Bạn cũng cần thêm điều khiển vào bộ sưu tập điều khiển TRƯỚC KHI bạn đặt thuộc tính. ViewState không được ghi lại cho đến khi nó được thêm vào bộ sưu tập điều khiển.

placeholder.Controls.Add(ctrl); 
((ControlType)ctrl).SomeProperty = someData;