2008-08-28 30 views
12

Tôi đang sử dụng phiên bản cũ hơn của ASP.NET AJAX do giới hạn thời gian chạy, Đặt Trình xác thực ASP.NET bên trong bảng cập nhật không hoạt động. Có một thủ thuật để làm cho những công việc này, hoặc tôi cần phải sử dụng kiểm soát ValidatorCallOut đi kèm với bộ công cụ AJAX?ASP.NET Validators bên trong UpdatePanel

Trả lời

21

Tôi nghi ngờ bạn đang chạy bản phát hành gốc (RTM) của .NET 2.0.

Cho đến khi kiểm soát trình xác thực năm 2007 không tương thích với UpdatePanels. Điều này đã được giải quyết với SP1 của .NET Framework.

Nguồn của sự cố là UpdatePanel có thể phát hiện các thay đổi đánh dấu trong trang của bạn, nhưng không có cách nào để theo dõi tập lệnh chính xác. Trình xác thực dựa nhiều vào tập lệnh. Trong quá trình postback một phần, các tập lệnh được thổi bay đi, không được cập nhật hoặc không chạy khi chúng được định nghĩa.

Trong bản beta đầu tiên, MS có UpdatePanel cố gắng đoán những tập lệnh nào cần được hiển thị lại hoặc chạy. Nó không hoạt động tốt lắm, và họ phải lấy nó ra.

Để giải quyết vấn đề trước mắt, Microsoft đã phát hành phiên bản vá lỗi của các lớp trình xác nhận hợp lệ trong một DLL mới có tên Validators.DLL và đưa ra hướng dẫn về cách sử dụng ASP.NET để sử dụng các lớp đó thay vì các lớp thực. Nếu bạn Google cho rằng tên DLL, bạn nên tìm thêm thông tin. Xem thêm This blog post.

Đây là biện pháp ngăn chặn và bạn nên không sử dụng số tránh nếu có thể.

Giải pháp thực sự cho sự cố xảy ra ngay sau đó, trong .NET 2.0 SP1. Microsoft đã giới thiệu một cơ chế mới để đăng ký các kịch bản lệnh trong SP1 và thay đổi các lớp trình xác nhận hợp lệ thực sự để sử dụng cơ chế đó thay vì cơ chế cũ hơn.

Hãy để tôi cung cấp cho bạn một số chi tiết về những thay đổi:

Theo truyền thống, bạn đã dự định đăng ký kịch bản thông qua phương pháp trang như Page.RegisterStartupScript() và Page.RegisterClientScriptBlock(). Vấn đề là các phương thức này không được thiết kế cho khả năng mở rộng và UpdatePanel không có cách nào để giám sát các cuộc gọi đó.

Trong SP1, có một đối tượng thuộc tính mới trên trang gọi là Page.ClientScripts. Đối tượng này có các phương thức để đăng ký các kịch bản lệnh tương đương (và theo cách nào đó tốt hơn) cho các kịch bản gốc. Ngoài ra, UpdatePanel có thể giám sát các cuộc gọi này, để nó hiển thị lại hoặc gọi các phương thức khi thích hợp. Các phương thức RegisterStartupScript(), vv cũ hơn đã không được chấp nhận. Họ vẫn làm việc, nhưng không phải bên trong UpdatePanel.

Không có lý do nào (ngoài chính trị, tôi giả sử) không cập nhật cài đặt của bạn lên .NET 2.0 SP1. Gói dịch vụ thực hiện các bản sửa lỗi quan trọng.

Chúc may mắn.

+0

Cảm ơn! Một trong các máy chủ của tôi đã hiển thị hành vi này và thực tế, nó thiếu sp1. – edosoft

2

@jmein

Trên thực tế vấn đề là kịch bản Validator của khách hàng không làm việc khi được đặt bên trong một UpdatePanel (UpdatePanels làm mới sử dụng .innerHTML, có thêm các nút kịch bản như các nút văn bản, không hạch kịch bản, vì vậy trình duyệt không chạy chúng).

Bản sửa lỗi là bản vá được phát hành bởi microsoft để khắc phục vấn đề này. Tôi tìm thấy nó với sự giúp đỡ của Google.

http://blogs.msdn.com/mattgi/archive/2007/01/23/asp-net-ajax-validators.aspx

3

@Jonathan Hà Lan: Điều gì là sai khi sử dụng Validators.dll?

Vì chúng thay thế lớp gốc, bạn lặng lẽ bỏ qua mọi lỗi và sửa lỗi bảo mật, cải tiến, v.v. mà Microsoft có thể phát hành trong tương lai (hoặc có thể đã được phát hành). Trừ khi bạn nhìn kỹ vào web.config, bạn có thể không bao giờ nhận thấy rằng bạn đang bỏ qua các bản vá lỗi.

Tất nhiên, bạn phải đánh giá từng tình huống. Nếu bạn hoàn toàn bị mắc kẹt bằng cách sử dụng .NET 2.0 RTM, thì Validators.dll là tốt hơn không có gì.

-1

Nếu vì những gì bao giờ lý do bạn không thể sử dụng phiên bản udpated của các điều khiển ASP.NET validator thực sự là rất dễ dàng để xác nhận một nhóm xác nhận chính mình, tất cả các bạn cần làm là gọi

Page_ClientValidate("validationGroupName"); 

Sau đó, bạn có thể sử dụng PageRequestManager thực hiện xác nhận khi bạn cần.

Chắc chắn bằng cách sử dụng các điều khiển xác thực được cập nhật là cách để đi, nhưng tôi khá một phần để JavaScript;)

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