2009-03-31 31 views
65

này đã không xảy ra với tôi trước đây, nhưng vì một lý do cả các sự kiện của khách hàng và phía máy chủ xác nhận không được kích hoạt:ASP.NET Tuỳ chỉnh Validator phía khách hàng & máy chủ xác nhận Side không bắn

<asp:TextBox ID="TextBoxDTownCity" runat="server" CssClass="contactfield" /> 
<asp:CustomValidator ID="CustomValidator2" runat="server" EnableClientScript="true" 
    ErrorMessage="Delivery Town or City required" 
    ClientValidationFunction="TextBoxDTownCityClient" 
    ControlToValidate="TextBoxDTownCity" 
    OnServerValidate="TextBoxDTownCity_Validate" Display="Dynamic" > 
</asp:CustomValidator> 

Server- sự kiện xác nhận phía:

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

Client-side validation sự kiện:

function TextBoxDCountyClient(sender, args) { 
    args.IsValid = false; 
    alert("test"); 
} 

tôi thoug ht ít nhất việc xác thực phía máy chủ sẽ kích hoạt nhưng không. Điều này chưa từng xảy ra với tôi trước đây. Điều này thực sự khiến tôi bối rối.

tôi nhìn vào sản lượng và ASP.NET được công nhận chức năng phía khách hàng:

ASP.NET Javascript đầu ra:

var ctl00_ctl00_content_content_CustomValidator2 = document.all ? document.all["ctl00_ctl00_content_content_CustomValidator2"] : document.getElementById("ctl00_ctl00_content_content_CustomValidator2"); 

ctl00_ctl00_content_content_CustomValidator2.controltovalidate = "ctl00_ctl00_content_content_TextBoxDTownCity"; 

ctl00_ctl00_content_content_CustomValidator2.errormessage = "Delivery Town or City required"; 

ctl00_ctl00_content_content_CustomValidator2.display = "Dynamic"; 

ctl00_ctl00_content_content_CustomValidator2.evaluationfunction = "CustomValidatorEvaluateIsValid"; 

ctl00_ctl00_content_content_CustomValidator2.clientvalidationfunction = "TextBoxDTownCityClient"; 

rendered tùy chỉnh validator:

<span id="ctl00_ctl00_content_content_CustomValidator2" style="color:Red;display:none;">Delivery Town or City required</span> 

Can bất kỳ một trong những nhà kho một số ánh sáng là lý do tại sao cả hai khách hàng và phía máy chủ xác nhận sẽ không được bắn.

Edit: Typo tôi dán trong hàm sai, vấn đề vẫn như nhau

Chỉ cần một bản cập nhật để bình luận cuối cùng: nơi của TextBox không thể để trống. Tôi đã thử nghiệm điều này và điều đó không đúng. Trên một trang trống CustomValidator bắn phía khách hàng của tôi chức năng xác nhận tốt mà không có một giá trị:

<asp:TextBox ID="TextBox1" runat="server" /> 
<asp:CustomValidator ID="CustomValidator1" runat="server" 
ErrorMessage="CustomValidator" ClientValidationFunction="TextBoxDAddress1Client"></asp:CustomValidator> 
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" /> 

Trả lời

107

CustomValidator của bạn sẽ chỉ kích hoạt khi TextBox không trống.

Nếu bạn cần đảm bảo rằng nó không có sản phẩm nào thì bạn cũng sẽ cần RequiredFieldValidator.

Note: If the input control is empty, no validation functions are called and validation succeeds. Use a RequiredFieldValidator control to require the user to enter data in the input control.

EDIT:

Nếu CustomValidator mà bạn chỉ định thuộc tính ControlToValidate (và ví dụ ban đầu của bạn không) sau đó chức năng xác nhận của bạn sẽ chỉ được gọi khi sự kiểm soát là không có sản phẩm nào .

Nếu bạn không chỉ định ControlToValidate thì chức năng xác thực của bạn sẽ được gọi mỗi lần.

Điều này sẽ mở ra giải pháp khả thi thứ hai cho sự cố. Thay vì sử dụng một riêng biệt RequiredFieldValidator, bạn có thể bỏ qua các ControlToValidate thuộc tính từ CustomValidator và thiết lập chức năng xác nhận của bạn để làm một cái gì đó như thế này:

Khách hàng đang Side (Javascript):

function TextBoxDCountyClient(sender, args) { 
    var v = document.getElementById('<%=TextBoxDTownCity.ClientID%>').value; 
    if (v == '') { 
     args.IsValid = false; // field is empty 
    } 
    else { 
     // do your other validation tests here... 
    } 
} 

mã phía máy chủ (C#):

protected void TextBoxDTownCity_Validate(
    object source, ServerValidateEventArgs args) 
{ 
    string v = TextBoxDTownCity.Text; 
    if (v == string.Empty) 
    { 
     args.IsValid = false; // field is empty 
    } 
    else 
    { 
     // do your other validation tests here... 
    } 
} 
+2

quá nhanh cho tôi, tôi đã nhập câu trả lời tương tự :) +1 –

+2

"CustomValidator của bạn sẽ chỉ kích hoạt khi TextBox không trống "Tôi đã thử nghiệm điều này trên một trang sạch sẽ và điều đó không đúng.Chức năng xác nhận ứng dụng khách kích hoạt ngay cả khi hộp văn bản trống rỗng –

+0

@REA_ANDREW, Không hoàn toàn! Tôi sẽ cập nhật câu trả lời của tôi để giải thích. – LukeH

3

Bạn có xác minh rằng sự kiểm soát gây ra bài lại đã CausesValidation thiết lập để tru và rằng nó không có một nhóm xác nhận giao cho nó?

Tôi không chắc chắn điều gì khác có thể gây ra hành vi này.

+0

Tôi sử dụng ImageButton cho Gửi và tôi chưa nêu bất kỳ nhóm xác thực nào. –

+0

hazah, đã khắc phục được sự cố của tôi, cảm ơn :) –

0

Xác thực phía máy chủ sẽ không kích hoạt nếu xác thực phía máy khách không hợp lệ, gửi lại không gửi.

Bạn không có một số xác thực khác không vượt qua?

Các xác nhận client-side không được thực hiện vì bạn chỉ định ClientValidationFunction="TextBoxDTownCityClient" và điều này sẽ tìm kiếm một hàm có tên TextBoxDTownCityClient như chức năng xác nhận, nhưng tên hàm nên TextBoxDAddress1Client

(như bạn đã viết)

+0

Xin lỗi, hãy cập nhật câu hỏi –

3

Xác thực phía máy khách không được thực hiện trên biểu mẫu web của tôi và tôi không biết tại sao. Nó chỉ ra vấn đề là tên của hàm javascript giống như ID điều khiển máy chủ.

Vì vậy, bạn không thể làm điều này ...

<script> 
    function vld(sender, args) { args.IsValid = true; } 
</script> 
<asp:CustomValidator runat="server" id="vld" ClientValidationFunction="vld" /> 

Nhưng điều này hoạt động:

<script> 
    function validate_vld(sender, args) { args.IsValid = true; } 
</script> 
<asp:CustomValidator runat="server" id="vld" ClientValidationFunction="validate_vld" /> 

Tôi đoán nó mâu thuẫn với nội .NET Javascript?

2

Ngoài ra kiểm tra rằng bạn đang không sử dụng các nhóm xác nhận là xác nhận rằng wouldnt bắn nếu tài sản validationgroup được thành lập và không rõ ràng gọi qua

Page.Validate({Insert validation group name here}); 
+0

Có, nhưng bạn vẫn cần văn bản trong hộp văn bản để trình xác nhận hoạt động tốt! – Fandango68

117

Sử dụng này:

<asp:CustomValidator runat="server" id="vld" ValidateEmptyText="true"/> 

Để xác thực có sản phẩm nào cánh đồng.

Bạn không cần phải thêm 2 trình xác thực!

+0

làm việc như một sự quyến rũ - giải pháp tốt – Sudara

+0

Giải pháp tôi đang tìm kiếm. . – Mehmood

0

Cảm ơn thông tin đó trên ControlToValidate LukeH!

Điều tôi đang cố gắng thực hiện trong mã của mình là chỉ đảm bảo rằng một số trường văn bản A có một số văn bản trong trường khi trường văn bản B có một giá trị cụ thể. Nếu không, A có thể để trống hoặc bất kỳ thứ gì khác. Loại bỏ ControlToValidate = "A" trong đánh dấu của tôi lên đã khắc phục vấn đề cho tôi.

Chúc mừng!

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