2009-03-31 29 views
65

Esto no me ha pasado antes, pero por alguna razón, tanto los eventos de validación del cliente y del lado del servidor no se activan:ASP.NET validador propio lado del cliente y la validación del lado del servidor no disparar

<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> 

Servidor- evento de validación del lado:

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

-lado del cliente evento de validación:

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

I thoug Al menos, la validación del lado del servidor se activaría pero no. esto nunca me ha sucedido antes. Esto realmente me ha dejado perplejo.

Miré a la salida y ASP.NET es el reconocimiento de la función del lado del cliente:

ASP.NET JavaScript salida:

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"; 

rindió validador personalizado:

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

Puede cualquier uno arrojó algo de luz sobre por qué la validación del lado del cliente y del servidor no se activaría.

Editar: Typos me pega en la función equivocada, el problema sigue siendo el mismo

Sólo otra actualización para el último comentario: Cuando en el cuadro de texto no puede estar vacío. Probé esto y no es verdad. En una página en blanco del CustomValidator disparó mi lado del cliente función de validación bien sin un valor:

<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" /> 

Respuesta

107

Su CustomValidator solo se activará cuando el TextBox no esté vacío.

Si es necesario asegurarse de que no está vacía, entonces se necesita un RequiredFieldValidator también.

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:

Si su CustomValidator especifica el atributo ControlToValidate (y su ejemplo original no) entonces sus funciones de validación solamente serán llamados cuando el control no está vacía .

Si no especifica ControlToValidate, se llamarán sus funciones de validación cada vez.

Esto abre una segunda solución posible al problema. En lugar de utilizar una por separado RequiredFieldValidator, se podría omitir el atributo ControlToValidate de los CustomValidator y configurar sus funciones de validación para hacer algo como esto:

cliente de código lateral (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... 
    } 
} 

código del lado del servidor (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

demasiado rápido para mí, estaba escribiendo la misma respuesta :) +1 –

+2

"Your CustomValidator solo se activará cuando el TextBox no sea vacío "Probé esto en una página limpia y no es cierto.La función de validación del cliente se dispara incluso cuando el cuadro de texto está vacío –

+0

@REA_ANDREW, ¡No del todo! Actualizaré mi respuesta para explicar. – LukeH

3

Quizás quiso verificar que el control causando el segundo palo ha establecido CausesValidation a tru y que no tiene un grupo de validación asignado a ¿eso?

No estoy seguro de qué más podría causar este comportamiento. la validación del lado del servidor

+0

Uso un ImageButton para Enviar, y no he indicado ningún grupo de validación. –

+0

hazah, eso solucionó mi problema, gracias :) –

0

no se disparará si la validación del lado del cliente no es válida, la devolución de datos no se envían.

¿No tiene alguna otra validación que no pase?

La validación del lado del cliente no se ejecuta porque ha especificado ClientValidationFunction="TextBoxDTownCityClient" y esto se verá en la función llamada TextBoxDTownCityClient como función de validación, pero el nombre de la función debe ser TextBoxDAddress1Client

(como los escribió)

+0

Twas un error de tipografía que actualizó la pregunta –

3

La validación del lado del cliente no se estaba ejecutando en absoluto en mi formulario web y no tenía idea de por qué. Resultó que el problema era que el nombre de la función javascript era el mismo que el ID de control del servidor.

lo que no puede hacer esto ...

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

Pero esto funciona:

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

supongo que entra en conflicto con .NET interna Javascript?

2

Compruebe también que no está utilizando grupos de validación como la validación molestaría fuego si la propiedad ValidationGroup fue establecido y no llama explícitamente a través de

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

Sí, pero todavía necesita texto en el cuadro de texto para que el validador funcione de todos modos! – Fandango68

117

Utilice esta:

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

para validar un vacío campo.

¡No necesita agregar 2 validadores!

+0

funcionó como un encanto - buena solución – Sudara

+0

La solución que estaba buscando. Gracias . – Mehmood

0

Gracias por la información sobre el ControlToValidate LukeH!

Lo que intentaba hacer en mi código era solo asegurarme de que algún campo de texto A tenga algo de texto en el campo cuando el campo de texto B tiene un valor particular. De lo contrario, A puede estar en blanco o lo que sea. Deshacerse de ControlToValidate = "A" en mi marca solucionó el problema.

¡Salud!

Cuestiones relacionadas