2008-09-22 28 views
9

Tôi đang cố gắng bọc đầu quanh asp.net. Tôi có một nền tảng như một nhà phát triển php thời gian dài, nhưng bây giờ tôi đang phải đối mặt với nhiệm vụ học asp.net và tôi đang gặp một số rắc rối với nó. Nó có thể rất tốt bởi vì tôi đang cố ép khung thành thứ gì đó mà nó không có ý định - vì vậy tôi muốn học cách làm điều đó "đúng cách". :-)Điều khiển động được thêm vào trong Asp.Net

Vấn đề của tôi là cách thêm điều khiển vào trang theo chương trình khi chạy. Theo như tôi có thể tìm ra bạn cần phải tạo ra các điều khiển tại page_init như họ nếu không biến mất tại PostBack tiếp theo. Nhưng nhiều lần tôi phải đối mặt với vấn đề mà tôi không biết điều khiển để thêm vào page_init vì nó phụ thuộc vào các giá trị từ tại PostBack trước đó.

Kịch bản đơn giản có thể là biểu mẫu có điều khiển thả xuống được thêm vào trong trình thiết kế. Trình đơn thả xuống được đặt thành AutoPostBack. Khi PostBack xảy ra, tôi cần phải hiển thị một hoặc nhiều điều khiển phụ thuộc vào giá trị đã chọn từ điều khiển thả xuống và tốt nhất là các điều khiển đó hoạt động như thể chúng đã được thiết kế thêm (như trong "khi đăng lại, hoạt động" đúng).

tôi đi xuống con đường sai ở đây

+0

Tôi nghĩ rất nhiều người ở đây đang hướng bạn xuống con đường sai; trong khi tất cả các câu trả lời của họ đều đúng về mặt kỹ thuật, tôi thực sự sẽ không làm theo cách này. Cách quá phức tạp, so với một giải pháp thanh lịch hơn như MultiView hay gì đó. – Domenic

Trả lời

8

Tôi đồng ý với các điểm khác thực hiện ở đây "Nếu bạn có thể nhận ra của việc tạo ra điều khiển tự động , sau đó làm như vậy ... "(by @Jesper Blad Jenson aka) nhưng đây là một mẹo tôi đã làm việc với các điều khiển được tạo động trong quá khứ.

Vấn đề trở thành gà và trứng. Bạn cần ViewState của bạn để tạo cây điều khiển và bạn cần cây điều khiển của bạn tạo ra để có được tại ViewState của bạn. Vâng, đó là gần như chính xác. Có một cách để lấy các giá trị ViewState của bạn ngay trước phần còn lại của cây được điền. Đó là bằng cách ghi đè LoadViewState(...)SaveViewState(...).

Trong SaveViewState lưu trữ các kiểm soát mà bạn muốn tạo:

protected override object SaveViewState() 
{ 
    object[] myState = new object[2]; 
    myState[0] = base.SaveViewState(); 
    myState[1] = controlPickerDropDown.SelectedValue; 

    return myState 
} 

Khi khuôn khổ gọi là "LoadViewState" bạn ghi đè lên bạn sẽ lấy lại đối tượng chính xác mà bạn trở về từ "SaveViewState":

protected override void LoadViewState(object savedState) 
{ 
    object[] myState = (object[])savedState; 

    // Here is the trick, use the value you saved here to create your control tree. 
    CreateControlBasedOnDropDownValue(myState[1]); 

    // Call the base method to ensure everything works correctly. 
    base.LoadViewState(myState[0]); 
} 

Tôi đã sử dụng thành công để tạo các trang ASP.Net nơi một Số liệu đã được tuần tự hóa thành ViewState để lưu trữ các thay đổi cho toàn bộ lưới dữ liệu cho phép người dùng thực hiện nhiều chỉnh sửa với PostBacks và cuối cùng cam kết tất cả thay đổi của họ trong một lần duy nhất " Lưu "hoạt động.

+0

Điều này có vẻ như là một ý tưởng hay. Tôi sẽ suy nghĩ về nó một lúc và xem liệu tôi có thể phù hợp với suy nghĩ của tôi hay có thể là cách khác. :-) – mlarsen

+0

Lỗi chính tả ... đối tượng [0] phải là myState [0] ... – Brij

+0

Rất thích @Brij. Đã sửa lỗi, cảm ơn. –

0

Vâng Nếu bạn có thể nhận ra của việc tạo ra các điều khiển dynamicly, sau đó làm như vậy -?. cách khác, những gì tôi whould làm là sử dụng Page_Load thay vì Page_Init, nhưng thay vì đặt nội dung bên trong If Not IsPostBack, sau đó đặt tôi trực tiếp trong phương thức

0

Tôi nghĩ câu trả lời ở đây là trong điều khiển MultiView, do đó, ví dụ: công tắc thả xuống đặt cược quan sát các chế độ xem khác nhau trong chế độ xem đa.

Bạn thậm chí có thể gắn kết dữ liệu thuộc tính chế độ xem hiện tại của multiview với giá trị của menu thả xuống!

0

Ah, đó là vấn đề với sự trừu tượng bị rò rỉ của biểu mẫu web ASP.NET.

Có thể bạn sẽ quan tâm để xem ASP.NET MVC, được sử dụng để tạo trang web stackoverflow.com này? Điều đó sẽ dễ dàng hơn cho bạn, đến từ một nền tảng PHP (do đó, bàn đạp-to-the-kim loại khi nói đến HTML và Javascript).

+0

Có, ASP.NET MVC trông rất hứa hẹn và gần gũi hơn với cách tôi đang sử dụng để làm việc. Thật không may đồng nghiệp của tôi có một nền tảng trong việc phát triển WinForms và tôi không chắc tôi có thể thuyết phục họ rằng ASP.NET MVC là con đường để đi. – mlarsen

3

Bạn phải thêm điều khiển bên trong sự kiện OnInit và chế độ xem sẽ được giữ nguyên. Không sử dụng if (ispostback), bởi vì các điều khiển phải được thêm vào mỗi lần, sự kiện trong postback!
(De) Việc tuần tự hóa ViewState xảy ra sau OnInit và trước khi OnLoad, do đó nhà cung cấp liên tục của bạn sẽ thấy các điều khiển được thêm động nếu chúng được thêm vào OnInit.

Nhưng trong trường hợp bạn mô tả, có thể là đa nhiệm hoặc ẩn/hiển thị đơn giản (thuộc tính hiển thị) sẽ là giải pháp tốt hơn.
Đó là vì trong sự kiện OnInit, khi bạn phải đọc danh sách thả xuống và thêm điều khiển mới, ViewState chưa được đọc (đã được deserialized) và bạn không biết người dùng đã chọn gì! (Bạn có thể làm request.form(), nhưng mà cảm thấy kinda sai)

1

Nếu bạn thực sự cần phải sử dụng điều khiển động, sau đây nên làm việc:

  • Trong OnInit, tái tạo lại hệ thống phân cấp quản lý cùng chính xác mà đã ở trên trang khi yêu cầu trước đó được thực hiện. (Nếu đây không phải là yêu cầu ban đầu, tất nhiên)
  • Sau OnInit, khung sẽ tải khung nhìn từ yêu cầu trước đó và tất cả các điều khiển của bạn sẽ ở trạng thái ổn định ngay bây giờ.
  • Trong khi tải, hãy xóa các điều khiển không bắt buộc và thêm các điều khiển cần thiết.Bạn cũng sẽ phải bằng cách nào đó lưu cây điều khiển hiện tại vào thời điểm này, để được sử dụng trong bước đầu tiên trong yêu cầu sau. Bạn có thể sử dụng biến phiên quyết định cách cây điều khiển động được tạo ra. Tôi thậm chí đã lưu toàn bộ bộ sưu tập Điều khiển trong phiên một lần (đặt sang một bên các chĩa quảng cáo của bạn, nó chỉ dành cho bản trình diễn).

Thêm lại các điều khiển "cũ" mà bạn sẽ không cần và sẽ bị xóa tại OnLoad dù có vẻ hơi kỳ quặc, nhưng Asp.Net không thực sự được thiết kế với tính năng tạo điều khiển động. Nếu hệ thống phân cấp kiểm soát chính xác không được lưu giữ trong quá trình tải ViewState, tất cả các loại lỗi khó tìm thấy sẽ bắt đầu ẩn trong trang, bởi vì các trạng thái của các điều khiển cũ được nạp vào những cái mới được thêm vào.

Đọc trên vòng đời trang Asp.Net và đặc biệt là cách hoạt động của ViewState và nó sẽ trở nên rõ ràng.

Chỉnh sửa: Đây là một bài viết rất tốt về cách ViewState cư xử và những gì bạn nên cân nhắc khi giao dịch với các điều khiển động: http://geekswithblogs.net/FrostRed/archive/2007/02/17/106547.aspx

0

Câu trả lời đúng duy nhất được đưa ra bởi Aydsman. LoadViewState là nơi duy nhất để thêm các điều khiển động nơi các giá trị viewstate của chúng sẽ được khôi phục khi được tái tạo và bạn có thể truy cập viewstate để xác định các điều khiển cần thêm vào.

0

tôi chạy qua này trong cuốn sách "Pro ASP.NET 3.5 trong C# 2008" dưới phần động kiểm soát Creation:

Nếu bạn cần phải tái tạo một điều khiển nhiều lần, bạn nên thực hiện tạo điều khiển trong trình xử lý sự kiện Page.Load. Điều này có lợi ích bổ sung cho phép bạn sử dụng trạng thái xem với điều khiển động của bạn. Mặc dù trạng thái xem thường được khôi phục trước sự kiện Page.Load, nếu bạn tạo một điều khiển trong trình xử lý cho sự kiện Page.Load, ASP.NET sẽ áp dụng bất kỳ thông tin trạng thái xem nào mà nó có sau khi xử lý sự kiện Page.Load kết thúc. Quá trình này là tự động.

Tôi chưa thử nghiệm điều này, nhưng bạn có thể xem xét nó.

2

Sau khi đã vật lộn với vấn đề này trong khi tôi đã tìm ra những groundrules mà dường như làm việc, nhưng YMMV.

  • Sử dụng điều khiển tường thuật bất cứ khi nào có thể
  • Sử dụng liên kết dữ liệu nếu có thể
  • Hiểu cách ViewState làm việc
  • Thuộc tính visibilty có thể đi một chặng đường dài
  • Nếu bạn phải sử dụng thêm các điều khiển trong việc sử dụng xử lý sự kiện Mẹo của Aydsman và tạo lại các điều khiển trong LoadViewState bị ghi đè.

TRULY Understanding ViewState là sách phải đọc.

Understanding Dynamic Controls By Example hiển thị một số kỹ thuật về cách sử dụng databinding thay vì điều khiển động.

TRULY Understanding Dynamic Controls cũng làm rõ các kỹ thuật có thể được sử dụng để tránh điều khiển động.

Hy vọng điều này sẽ giúp những người khác có cùng vấn đề.

+0

+1 đặc biệt là "tài sản Visibilty có thể đi một chặng đường dài", làm cho tôi nhận ra tôi có thể giữ cho vấn đề của tôi đơn giản hơn. –

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