2008-09-19 20 views
8

Tôi đang thêm một số điều khiển người dùng động vào điều khiển máy chủ PlaceHolder. Điều khiển người dùng của tôi bao gồm một số nhãn và một số điều khiển hộp văn bản.ASP.Net: Điều khiển người dùng được thêm vào trình giữ chỗ tự động không thể truy lục giá trị

Khi tôi gửi biểu mẫu và cố gắng xem nội dung của hộp văn bản (trong mỗi điều khiển người dùng) trên máy chủ, chúng trống.

Khi đăng lại hoàn tất, hộp văn bản có dữ liệu mà tôi đã nhập trước khi đăng lại. Điều này cho tôi biết rằng văn bản trong các hộp đang được giữ lại thông qua ViewState. Tôi chỉ không biết tại sao tôi không thể tìm thấy chúng khi tôi đang gỡ lỗi.

Ai đó có thể vui lòng cho tôi biết lý do tôi không thấy dữ liệu người dùng đã nhập trên máy chủ không?

Cảm ơn bạn đã được trợ giúp.

Trả lời

9

này được dựa trên chuỗi sự kiện .NET v1, nhưng nó sẽ cho bạn ý tưởng:

  • Khởi tạo (Init event)
  • Bắt đầu theo dõi Trạng thái xem (kiểm tra nếu postback)
    • tải Xem Nhà nước (nếu postback)
    • tải Postback dữ liệu (nếu postback)
  • tải (Load sự kiện)
    • Raise Thay đổi sự kiện (nếu postback)
    • Raise Postback Sự kiện (nếu postback)
  • PreRender (PreRender sự kiện)
  • Lưu Xem Nhà nước
  • Render
  • Unload (Unload sự kiện)
  • Vứt

Như bạn có thể thấy, việc tải dữ liệu ViewState trở lại điều khiển xảy ra trước sự kiện Load. Vì vậy, để các điều khiển được thêm động của bạn "giữ lại" các giá trị đó, chúng phải là trình bày cho trang ASP.NET để tải lại các giá trị ở vị trí đầu tiên. Bạn sẽ phải tạo lại các điều khiển đó ở giai đoạn Init, trước khi trạng thái Load View xuất hiện.

+2

Tôi nhận thấy rằng điều khiển phải được tạo lại bằng cùng một ID. Trong một số trường hợp, có vẻ như nó không giống nhau ... vì vậy tôi lừa dối và mã hóa nó, hoạt động nhưng cực kỳ không thích hợp. –

2

Tôi tin rằng bạn sẽ cần phải thêm UserControl vào PlaceHolder trong giai đoạn Init của vòng đời trang, để có được ViewState được điền vào bởi giai đoạn Load để đọc các giá trị đó. Đây có phải là thứ tự bạn đang tải chúng không?

0

Bạn phải tạo các điều khiển trong trình xử lý sự kiện Page_PreInit. ASP.NET mô hình điều khiển máy chủ là khó khăn; bạn phải hiểu đầy đủ số page lifecycle để làm điều đó đúng.

0

Như những người khác đã nói, bất kỳ hình thức thao tác điều khiển nào phải được thực hiện trước khi tạo ra ViewState.

Dưới đây là một liên kết tốt về vòng đời trang để giúp bạn ra ngoài:

http://msdn.microsoft.com/en-us/library/ms178472.aspx

1

Đảm bảo bạn đang định điều khiển động của bạn ở cấp lớp và thêm chúng vào container ASP:

Private dynControl As ASP.MyNamespace_MyControl_ascx 

Và khi bạn nhanh chóng kiểm soát, đảm bảo bạn gọi LoadControl nên đối tượng được bổ sung đúng cách:

dynControl = CType(LoadControl("~/MyNamespace/MyControl/MyControl.ascx"), ASP.MyNamespace_MyControl_ascx) 
0

Chúng tôi đã trải nghiệm cùng một điều và đã xử lý nó bằng cách sử dụng điều khiển ma trên page_load có cùng một chính xác .ID và sau đó bài trở lại chọn lên các sự kiện và dữ liệu. Như những người khác cho biết đó là sự bổ sung năng động của sự kiểm soát sau khi các giai đoạn init rằng nhà nước được xây dựng đã có và điều khiển được thêm vào sau khi không được lưu trữ.

Hy vọng điều này sẽ giúp ích một chút.

0

Tôi cũng muốn thêm rằng tôi đã nhìn thấy điều khiển người dùng hoạt động theo cách bạn mong đợi họ chỉ bằng cách đặt thuộc tính Control.ID tại thời gian chạy. Nếu bạn không đặt ID, các mục có thể được tạo theo thứ tự khác và hoạt động một cách kỳ lạ.

3

Tôi đã tìm ra hôm qua rằng bạn thực sự có thể làm cho ứng dụng của bạn hoạt động như bình thường bằng cách tải cây điều khiển ngay sau khi loadviewstateevent được kích hoạt. nếu bạn ghi đè lên sự kiện loadviewstate, hãy gọi mybase.loadviewstate và sau đó đặt mã của riêng bạn để tạo lại các điều khiển ngay sau đó, các giá trị cho các điều khiển đó sẽ có sẵn khi tải trang. Trong một trong các ứng dụng của tôi, tôi sử dụng trường viewstate để giữ ID hoặc thông tin mảng có thể được sử dụng để tạo lại các điều khiển đó.

Protected Overrides Sub LoadViewState(ByVal savedState As Object) 
    MyBase.LoadViewState(savedState) 
    If IsPostBack Then 
     CreateMyControls() 
    End If 
End Sub 
+0

Đẹp nhất - có vẻ như phản trực giác mà chúng ta tạo ra các điều khiển/sau/ViewState được nạp - nhưng nó hoạt động độc đáo. –