2010-03-11 25 views
5

Woo, tôi có một vấn đề doozy (thậm chí có thể là một vấn đề cho WTF hàng ngày) và tôi hy vọng có một giải pháp. (Xin lỗi vì bài đăng dài ...)Thay thế cho Page_Load trong ASP.NET (và một câu chuyện WTF tốt)

Tôi đã làm việc trên một trang web mà tôi đã kế thừa khoảng một tháng trước. Một trong những phần tôi đang làm là sửa một trong các điều khiển (về cơ bản là thanh tiêu đề động) để nó hiển thị thông tin bổ sung theo yêu cầu của người dùng của tôi. Là một phần của dự án này, tôi đã tạo một tệp Site.master để tôi không phải recode thanh tiêu đề vào từng trang. Khi tôi lần đầu tiên bắt đầu làm điều này, nó dường như làm việc rất tốt. Tất cả các trang tôi đã phát triển trông tuyệt vời và thanh được cập nhật vì nó sẽ hiển thị thông tin như nó cần.

Vâng, khi tôi bỏ Site.master (và điều khiển này) vào các trang cũ hơn (những trang tôi không phát triển cụ thể), tôi nhận thấy rằng nó trông có vẻ xấu trên một số, nhưng không phải tất cả chúng. Khi tôi nói nó trông xấu, về cơ bản, sự kiểm soát sẽ trái-align chính nó đến trang chứ không phải là trung tâm như nó cần. Tôi đã dành một vài giờ gỡ lỗi để không có kết quả - CSS nhìn chính xác, HTML dường như không sao, tôi không thấy bất cứ điều gì trong Javascript (mặc dù, tôi đã bỏ lỡ một cái gì đó như tôi sẽ chỉ ra trong một giây), và thậm chí mã cũ trông đúng (tốt nhất là nó có thể - nó không được viết rất tốt). Một đồng nghiệp khác đã nhìn vào trang web và không thể tìm thấy bất cứ điều gì lúc đầu, một trong hai. Nó không phải cho đến khi tôi chỉ nghĩ đến việc xem mã nguồn được hiển thị của trang (tôi đã làm việc trong chế độ xem nhà phát triển cho đến thời điểm này trong IE8) rằng nó đã trở nên rõ ràng những gì đã sai.

Nhà phát triển ban đầu thực hiện tìm kiếm trên nhiều trang. Để thực hiện điều này, ông truy vấn cơ sở dữ liệu cho TẤT CẢ dữ liệu và sau đó tải chúng vào các mảng Javascript trong trang để có thể truy cập chúng. Điều này trong chính nó là một vấn đề lớn bởi vì chúng tôi đang nói về hàng ngàn mặt hàng, và nó rõ ràng là không thể mở rộng (và, có, trang web là chậm). Tuy nhiên, nó cuối cùng đã nhấp vào những gì đã được vặn lên Site.master - khi ông tải dữ liệu vào các mảng Javascript, ông viết ra dữ liệu cho HTML khi Page_Load sử dụng nhiều cuộc gọi Response.Write (string). Các WTF (và những gì đã rối tung tôi lên) là ông chèn Javascript trước khi DOCTYPE gây ra IE để đi vào chế độ quirks! Vì vậy, bởi vì tôi cần ít nhất có được bản phát hành này ra (tôi sẽ khắc phục vấn đề thực sự sau), tôi đã tự hỏi: có cách nào tôi có thể buộc Javascript này được chèn vào nơi khác vào HTML — sau khi DOCTYPE ít nhất? Ngay bây giờ, tất cả các cuộc gọi Response.Write() đang được thực hiện trong phương thức Page_Load. Tôi chỉ cần chúng được đưa vào sau.

Trả lời

5

Có một số cách để làm điều này, nhiều khả năng cách "đúng" để làm điều này là xây dựng chuỗi, sau đó sử dụng phương thức Page.ClientScript.RegisterClientScriptBlock để đăng ký JS, điều này sẽ đặt nó ở bên phải đặt

Một giải pháp thay thế khác, đó là cách thêm nhanh chóng và bẩn thỉu là thêm điều khiển vào trang và thay vì trả lời, viết JS, sau đó đặt thuộc tính văn bản của kiểm soát theo nghĩa đen.

+0

1 - chúng tôi đã đăng * cùng một giây *, nhưng câu trả lời của bạn tốt hơn :) –

+0

Cảm ơn, tôi cũng đã thực sự viết lại nó, như kỹ thuật Page.ClientScript là "tốt hơn" và đúng cách để làm điều đó ... –

0

Đặt mã JavaScript được tạo vào một thuộc tính trên trang chính và trang chính xử lý nó. Trang cái hiển thị sau các trang mà nó đóng gói, nhưng các thành viên có sẵn cho các trang nội dung của trang đó.

1

Cách đơn giản nhất để thay thế các cuộc gọi Response.Write có lẽ sẽ sử dụng một StringBuilder:

StringBuilder sb = new StringBuilder(); 
sb.Append("your script writes here"); // instead of Response.Write 

Và sử dụng các trang.Trình quản lý ClientScript để đặt tập lệnh vào nơi nó có thể được sử dụng. Có một số phương pháp để đăng ký kịch bản, và mỗi người đặt kịch bản tại các địa điểm khác nhau trên trang web, tùy thuộc vào vòng đời của việc kiểm soát hiện tại bạn đang ở trong đây là một ví dụ (đã đề cập ở trên):.

Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "yourScriptKey", sb.ToString()); 
Các vấn đề liên quan