2012-04-17 18 views
6

Giả sử chúng ta có một biểu mẫu khá chuẩn với hộp văn bản và nút (để đơn giản). Bạn muốn xử lý sự kiện Nhấp và thực hiện một số nội dung dựa trên dữ liệu nhập của người dùng.Khi nào để kết nối bộ điều khiển sự kiện asp.net

Tôi đã tự hỏi, điều đó có quan trọng không, khi chính xác bạn kết nối một trình xử lý sự kiện cho sự kiện Nhấp trong mã sau? Nếu có, đâu là nơi tốt nhất để đặt nó? Tải trang? Trang init? Tôi đã thử cả hai nơi, nhưng không nhận thấy bất kỳ sự khác biệt nào. Hoặc nó chỉ là một sở thích cá nhân của lập trình viên? Tôi đã tìm kiếm vài lần trên internet nhưng chưa tìm thấy câu trả lời thỏa đáng nào.

Tôi biết khi nào phương thức thực thi thực hiện, chỉ cần không chắc chắn về phần nối dây.

+0

bạn đang sử dụng bất kỳ khuôn khổ như MVC hoặc là này webforms ASP.Net? –

+3

@JeremyThompson. trong MVC không có mã phía sau, cảm ơn Chúa! – gdoron

+0

@JeremyThompson, webforms ... :) – walther

Trả lời

15

Như bạn đã biết, có một số bộ xử lý Page_xxx sự kiện, như Init, Load, Prerender ... sự kiện này tồn tại trong Controls, và Trang cũng như kiểm soát tài khoản (trong thực tế, họ đang có nguồn gốc hình thức Control, nắm giữ tất cả những sự kiện này).

sự kiện này có liên quan đến ASP.NET Page Life Cycle

Nếu bạn đọc trang trỏ đến bởi liên kết này một cách cẩn thận, bạn sẽ hiểu khi sự kiện được kích hoạt. Vì vậy, nếu bạn ràng buộc trình xử lý sự kiện của bạn trong bất kỳ sự kiện vòng đời nào xảy ra trước khi các sự kiện được kích hoạt, nó được đảm bảo rằng trình xử lý sự kiện của bạn sẽ bị ràng buộc đúng lúc để được kích hoạt.

Đây là những bước vòng đời chính:

PreInit -> Init -> InitComplete -> PreLoad -> Load -> [Control events] -> 
LoadComplete -> PreRender -> SaveStateComplete -> Render -> Unload 

sự kiện Không phải tất cả trong số họ đã có liên quan, nhưng nếu đó là cần thiết, bạn có thể ghi đè lên OnXxx() chức năng tương ứng, như OnPreInit(). (Điều này thường chỉ được thực hiện trên các điều khiển máy chủ tùy chỉnh).

Bạn có thể liên kết các sự kiện trong Page_Init hoặc Page_Load, bởi vì các sự kiện kiểm soát được triggerd sau khi tải của tất cả các điều khiển đã hoàn tất. Bước Load xảy ra theo cách từ trên xuống, đầu tiên trong Trang và sau đó đệ quy trong tất cả các nút điều khiển của trẻ em.

Sau khi kết thúc Load, các sự kiện đầu tiên được kích hoạt là Sự kiện thay đổi, như TextChanged hoặc SelectionChanged. Sau đó, được kích hoạt tất cả các sự kiện khác, như Click.

Nếu bạn ràng buộc các sự kiện trong PreRender hoặc Unload, chúng sẽ không được kích hoạt. Nếu bạn đã làm trong Init hoặc Load, họ sẽ.

Vì vậy nó có thể trông giống như nó an toàn để ràng buộc trong Init hoặc Load, nhưng đó là không đúng sự thật:

Nó có thể trông giống như không có lý do đặc biệt để gắn chúng trên Init hoặc Load, bởi vì họ sẽ được kích hoạt sau trong vòng đời của trang. Tuy nhiên, như ràng buộc được xác định trong các .aspx xảy ra trong Init, một lập trình viên sẽ mong đợi rằng tất cả các sự kiện đã bị ràng buộc trong sự kiện Load. Điều gì sẽ xảy ra nếu lập trình viên này nêu lên một sự kiện kiểm soát trẻ em trong mã phía sau? Sự kiện Load xảy ra đầu tiên trong thư mục gốc của cây điều khiển và trên tất cả các trẻ em, đệ quy. Vì vậy, vào thời điểm lập trình viên đang cố gắng nâng cao sự kiện kiểm soát trẻ em, nó sẽ không bị ràng buộc. Vì vậy, điều này sẽ không hoạt động như mong đợi. Điều này là quá đủ để xem xét không an toàn để ràng buộc các sự kiện trong sự kiện Load. Đó là lý do tại sao bạn phải luôn ràng buộc các sự kiện trong Init.

Nhìn vào sơ đồ này để xem thứ tự thực hiện của trang & trẻ em sự kiện: ASP.NET Page Life Cycle Diagram

+0

Đó chính là lý do tại sao tôi đăng câu hỏi của mình. Tôi muốn có một sự hiểu biết sâu sắc hơn về WHY và WHEN để làm những việc nhất định. Tôi nghĩ rằng tôi hiểu vòng đời trang, khi nào để tạo điều khiển của tôi, nhưng không chắc về điều này, bởi vì tôi đã thấy các cách tiếp cận khác nhau. Trong khi một số lập trình viên làm điều đó trong sự kiện Load, những người khác như Init. Vì vậy, để hoàn thành câu hỏi của tôi - tôi có hiểu nó một cách chính xác, rằng nó không thực sự quan trọng mà nhiều và tôi chỉ cần chắc chắn không làm điều đó sau khi sự kiện Load đã kết thúc? (LoadComplete, Prerender, vv) – walther

+0

Tôi nghĩ rằng điều này sẽ trả lời câu hỏi của bạn kỹ lưỡng ngay sau khi chỉnh sửa. – JotaBe

+0

Có, cuối cùng đã có một câu trả lời thỏa đáng cho câu hỏi của tôi, cảm ơn bạn :) – walther

1

Tôi đã được nối dây điện trong thẻ điều khiển. Nếu tôi làm theo cách này, rõ ràng là có một trình xử lý sự kiện.

<asp:Button ID="btnRefresh" runat="server" Text="Refresh" OnClick="btnRefresh_Click" /> 

Nếu tôi buộc phải xử lý sự kiện trong codebehind, tôi sẽ đặt nó trong Page_Load như một cuộc gọi chức năng riêng tư.

+0

Vâng, tôi biết khả năng này, nhưng ... Tôi không thực sự là một fan hâm mộ của điều này, bởi vì tôi muốn tách các lớp của tôi nhiều nhất có thể. Tôi có một coder người làm việc trên các lớp trình bày (javascript, html, css ..) và tôi thực sự không thấy một lý do tại sao anh ta nên biết hoặc thậm chí quan tâm đến dây lên xử lý. Nếu tôi làm việc một mình, nó có thể hoàn toàn ổn, nhưng điều này không thực sự trả lời câu hỏi của tôi. Bạn sẽ nối dây cho một người xử lý ở đâu, nếu bạn HAD làm điều đó trong một đoạn mã? – walther

+0

@walther - Cảm ơn bạn đã bình luận. Tôi hiểu sự cần thiết phải giữ mọi thứ riêng biệt. Nếu tôi đã phải đặt nó trong codebehind, trước tiên tôi sẽ tạo một hàm để thiết lập trình xử lý sự kiện của tôi và sau đó gọi hàm từ Page_Load. – DaveB

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