2012-04-16 29 views
8

Tôi đã đặt CustomValidator vào biểu mẫu của mình. Tôi chưa đặt thuộc tính ControlToValidate của mình. Trong trường hợp ServerValidate của nó Tôi đã viết như sau:Phương thức CustomValidator ServerValidate không kích hoạt

protected void CustomValidator1_ServerValidate(object source,  
               ServerValidateEventArgs args) 
{ 
    args.IsValid = false; 
} 

tôi đặt một breakpoint để phương pháp này nhưng có vẻ như không bao giờ đến thời điểm đó. Nhưng nếu tôi làm điều này trên một hình thức khác nó hoạt động như một sự quyến rũ.

  1. Thuộc tính của cả hai nút và CustomValidatorValidationGroup đều giống nhau
  2. tôi đã cố gắng xóa thuộc tính này trong cả hai nút và CustomValidator, vẫn không hoạt động.

Có vẻ như có thứ gì đó toàn diện. Tôi chỉ cần đặt CustomValidator vào biểu mẫu và không chạm vào bất kỳ thuộc tính nào của nó ngoài việc chỉ thiết lập phương thức sự kiện ServerValidate của nó.

EDIT: Đây là phần aspx:

<asp:CustomValidator ID="CustomValidator2" runat="server" 
     ErrorMessage="This is a test" 
    onservervalidate="CustomValidator1_ServerValidate" 
    ValidationGroup="PA"></asp:CustomValidator> 


<asp:Button ID="btnPensionersOK" runat="server" Text="OK" Width="75px" 
      onclick="Button1_Click" ValidationGroup="PA" /> 

Trả lời

19

Cố gắng buộc các xác nhận trong xử lý nút chuột qua Page.Validate:

protected void Button1_Click(Object sender, EventArgs e) 
{ 
    Page.Validate(); 
    if(Page.IsValid) 
    { 
     // servervalidate should have been called 
    } 
} 

Sửa (từ bình luận):

Nếu bạn muốn customvalidator xác thực nếu không có gì được nhập/chọn trong điều khiển của bạn, bạn cần phải đặt ValidateEmptyText thành sự thật. Bạn cũng có thể muốn để số CustomValidator thay thế RequiredFieldValidators.

Tôi giả định rằng trình xác nhận hợp lệ trên aspx quyết định có hay không tùy chọn xác định giá trị severvalidate nếu Trình xác thực trước đó đã thực hiện Page.IsValid=false. Hoặc ASP.NET là rất thông minh mà nó giả định SeverValidate là tốn kém hơn một văn bản đơn giản là trống kiểm tra.

+0

Nhưng các trình xác thực khác hoạt động như thế nào? Tôi có một số RequiredFieldValidator trên cùng một hình thức nhưng họ làm việc bình thường. Và một lần nữa, tôi làm chính xác điều tương tự trên một hình thức khác, và không có vấn đề, nó xác nhận. Những điều là phương pháp ServerValidate không cháy. –

+1

@MikeJM: Tôi không biết. Bạn có databinding trong page_load trên postbacks? Bạn đang gọi một nơi nào khác 'Page.Validate()'? Bạn có nhận được bất kỳ lỗi javascript nào không? Do các RequiredFieldValidators có ngăn chặn việc postback không? Có đăng lại không? –

+0

Có, tôi đang databinding trong page_load nhưng không phải trên PostBack. Tôi không bao giờ gọi Page.validate() ở bất cứ nơi nào khác. Tôi không nhận được bất kỳ lỗi javascript nào. RequiredFieldValidators ngăn chặn đăng lại. Nó được đăng lại. –

0

Tôi cũng muốn đặt thêm một số trợ giúp cho những người sẽ sử dụng CustomValidators và RequiredFieldValidators cùng một lúc. Một nên đưa vào tài khoản mà xác nhận phía khách hàng diễn ra đầu tiên. Và xác thực phía máy chủ sẽ chỉ xảy ra sau khi PostBack. Tôi chắc rằng bạn đã có nó nhưng chỉ trong trường hợp điều này không rõ ràng: Nó có nghĩa là trước hết tất cả các điều khiển được ràng buộc với các trình xác nhận hợp lệ của phía máy khách nhất định phải hợp lệ để cho phép Postback xảy ra. Sau Trang. IsValid là công cụ phía máy chủ True diễn ra và gửi lại bất kỳ thay đổi nào bao gồm các thông báo xác thực phía máy chủ.

Vì vậy, đây là những cách người ta có thể làm cho cả hai CustomVCalidators và khác được xây dựng trong trình xác nhận làm việc tại cùng một thời điểm .:

  1. Đặt cả nhóm xác nhận để làm việc trên phía Client. Trong trường hợp này, chúng ta phải đảm bảo rằng đối với (các) người định giá tùy chỉnh, chúng tôi sẽ tách rời tập lệnh sẽ thực hiện xác thực ở phía máy khách. Nếu không có kịch bản viết và chỉ cần điền vào phương pháp ServerValidate xác nhận sẽ diễn ra trong server.Even nếu thuộc tính EnableClientScript được đặt thành True.

  2. Đặt cả hai nhóm trình xác thực để hoạt động ở phía máy chủ. Để làm như vậy chỉ cần đặt EnableClientScript thành False. Nhưng lưu ý rằng điều này sẽ tải máy chủ.

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