2012-03-03 26 views
8

Tôi đã thực hiện một số nghiên cứu liên quan đến điều khiển động và ViewState.Tại sao các điều khiển ASP.NET động có thể giữ ViewState ngay cả khi được thêm vào Page_Load?

Và tôi đọc rằng để giữ cho ViewState cho điều khiển động, bạn phải thêm nó vào sự kiện Page_Init. Điều này có ý nghĩa bởi vì PageLifeCycle là:

  1. Khởi tạo.
  2. LoadViewState.
  3. LoadPostbackData.
  4. Tải.
  5. RaisePostbackEvent.
  6. SaveViewState.
  7. Render.

Nhưng tôi đã thực hiện một ứng dụng thử nghiệm và tôi thấy rằng giá trị ViewState và thuộc tính được giữ nguyên ngay cả khi tôi thêm điều khiển trong sự kiện Page_Load chứ không phải sau đó. Từ này tôi chỉ tìm thấy thông tin mâu thuẫn. Một số người nói rằng các điều khiển có thể bắt được PageLifeCycle khác nói rằng bạn phải thêm chúng trong Page_Init. Ai đó có thể làm rõ điều này cho tôi?

Cũng trong MSDN tôi thấy:

Lưu ý Bạn có thể nhận được ngay với tải điều khiển của bạn trong xử lý sự kiện Page_Load và duy trì trạng thái điểm đúng cách. Nó tất cả phụ thuộc vào việc bạn có đang thiết lập bất kỳ thuộc tính nào của điều khiển được nạp động theo lập trình hay không và nếu có, thì bạn đang làm việc đó tương ứng với dòng Controls.Add (dynamicControl). Một cuộc thảo luận kỹ lưỡng về vấn đề này là một chút ngoài phạm vi của bài viết này, nhưng lý do nó có thể hoạt động là vì phương thức Add() của thuộc tính Điều khiển đệ quy tải trạng thái xem của cha mẹ vào con của nó, thậm chí . giai đoạn đã trôi qua.

Nhưng tôi thực sự không hiểu điều này hoàn toàn vì vậy tôi hy vọng ai đó có thể giải thích. Cảm ơn bạn trước.

Trả lời

4

Mã này sẽ chứng minh nó trong hành động:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Button b1 = new Button(); 
    Button b2 = new Button(); 
    if (!IsPostBack) 
    { 
     b1.Text = "Button1"; 
    } 
    this.form1.Controls.Add(b1); 
    this.form1.Controls.Add(b2); 
    if (!IsPostBack) 
    { 
     b2.Text = "Button2"; 
    } 
} 

vì vậy nếu bạn sửa đổi sự kiểm soát sau khi nó được thêm vào các hình thức nó giữ ViewState của nó, nhưng nếu bạn sửa đổi nó trước khi bạn thêm nó vào dưới dạng các văn bản không biến nó thành khung nhìn. Đây là những gì xảy ra - chính xác lý do tại sao nó giống như là một câu hỏi khác (nó thực sự là đảo ngược của những gì tôi đã có thể nghĩ đọc tài liệu).

EDIT
tôi quên đề cập đến - về cơ bản đây là do thực tế rằng sự kiểm soát lượt qua các vòng đời trang để "bắt kịp" với trang khi nó được thêm vào cây điều khiển thông qua Controls.Add () - có vô số bài viết về điều này bởi vì không có nhiều điều về nó đơn giản.

1

Trong quá khứ (ASP.NET 2.0 hoặc 3.5, không chắc chắn), khi cố gắng triển khai giống như bạn đang đề cập, tôi phải thêm các điều khiển trong Page_Init.Thêm chúng vào Page_Load Tôi sẽ không thấy những thay đổi được thực hiện ở phía máy khách đến phía máy chủ, điều này có ý nghĩa hoàn hảo bởi vì khi khung công tác cố gắng ràng buộc khung nhìn đến các điều khiển, chúng chưa được tạo ra.

Tôi rất ngạc nhiên khi biết điều này đã thay đổi. Có lẽ một cái gì đó được giới thiệu trong ASP.NET 4.0?

0

Trong NET 4.5, chỉ cần ghi đè phương thức CreateChildControls() và đặt bên trong tòa nhà điều khiển động.

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