c# - vacio - El validador personalizado de asp.net no se activa para el cuadro de texto
requiredfieldvalidator dropdownlist (7)
Tengo un validador de campo requerido y un validador personalizado para validar un texbox. El validador de campo requerido se dispara perfectamente. No puedo hacer que el validador personalizado se active correctamente.
<asp:TextBox ID="txtPRI" runat="server" Width="295" /><br />
<asp:RequiredFieldValidator display="Dynamic" CssClass="leftAlign" SetFocusOnError="true" runat="server" controltovalidate="txtPRI" errormessage="Please enter your PRI" />
<asp:CustomValidator runat="server" id="cusCustom" controltovalidate="txtPRI" onservervalidate="cusCustom_ServerValidate" Enabled="true" ValidateEmptyText="true" display="Dynamic" CssClass="leftAlign" SetFocusOnError="true" errormessage="The text must be exactly 8 characters long!" />
código detrás
protected void cusCustom_ServerValidate(object sender, ServerValidateEventArgs e)
{
Response.Write("firing - test");
Response.End();
if (e.Value.Length == 8)
e.IsValid = true;
else
e.IsValid = false;
}
Además de las sugerencias anteriores, he descubierto que con las versiones más recientes de .Net Framework debe activar explícitamente el método validate () en el servidor para obtener la rutina de validación personalizada.
// validate page before allowing import to go through
Page.Validate();
if (!Page.IsValid)
return;
Compruebe que tiene ValidateEmptyText
su propiedad ValidateEmptyText
CustomValidator
ValidateEmptyText
para que se valide el texto vacío. Entonces ya no necesitará el RequiredFieldValidator
.
EDITAR: Tomé su código y lo copié y pegué en un proyecto vacío y funciona como se esperaba. Debe haber algo que no haya publicado o esté publicando incorrectamente, de lo que no tenemos conocimiento. ¿Hay algo más que afecte al botón que está activando la validación o los controles de validación?
EDITAR: Aquí está el código exacto (está en una página de contenido):
página aspx:
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:TextBox ID="txtPRI" runat="server" Width="295" /><br />
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" display="Dynamic" CssClass="leftAlign" SetFocusOnError="true" runat="server" controltovalidate="txtPRI" errormessage="Please enter your PRI" />
<asp:CustomValidator runat="server" id="cusCustom" controltovalidate="txtPRI" onservervalidate="cusCustom_ServerValidate" Enabled="true" ValidateEmptyText="true" display="Dynamic" CssClass="leftAlign" SetFocusOnError="true" errormessage="The text must be exactly 8 characters long!" />
</asp:Content>
página .cs ( Page_Load
vacía):
protected void cusCustom_ServerValidate(object sender, ServerValidateEventArgs e)
{
// put a break point here and it stops on it
if (e.Value.Length == 8)
e.IsValid = true;
else
e.IsValid = false;
}
El problema es que está llamando a Response.End()
que detiene de manera efectiva toda la ejecución de la página. Por lo tanto, el bloque if / else no se está ejecutando en absoluto. Comente que salga de línea o saltee mientras depura y el validador se activará como se esperaba.
Sugiero que use un depurador en lugar de escribir respuestas de esta manera o tenga en cuenta las consecuencias de Response.End()
si elige usarlo.
Ok ... pregunta muy vieja sin respuesta aceptada todavía, y me encontré con el mismo problema.
Así que voy a lanzar esto para cualquier otra persona que pueda tener este problema y necesite una respuesta ...
Si está haciendo validaciones regulares, junto con validaciones personalizadas del servidor, la validación del servidor personalizado solo se activará si todas las demás validaciones vuelven limpias, al menos, así es como me funcionó.
Por lo que recuerdo, el validador personalizado no se activará si tu cuadro de texto está vacío.
Recuerde establecer esta propiedad en CustomValidator ...
ValidateEmptyText="True"
También tuve este problema. Sí, todos los demás validadores deben pasar antes de que se active el CustomValidator
Validator.
Sin embargo, si eso no funciona para usted, entonces puede necesitar forzar una validación de su grupo de validación específico utilizando la Page.Validate()
. Page.Validate()
.
Así es como lo hice, y aún así pude mantener mi RequiredFieldValidator
y no necesito ValidateEmptyText="true"
.
Agregue una trampa en el cuadro de texto para forzar una validación.
<asp:TextBox ID="txtLeft" runat="server" Width="110px" TextMode="SingleLine" style="text-align:center" OnTextChanged="TextBoxChanged_DateTimeTest" AutoPostBack="True" ValidationGroup="vg2"></asp:TextBox>
Tenga en cuenta que estoy usando un ValidationGroup
"vg2" específico, ya que tengo otras áreas que no quiero validar.
Además, quiero validar la fecha y la hora .
Necesitas dos cosas más. El método TextBoxChanged_DateTimeTest
...
protected void TextBoxChanged_DateTimeTest(object sender, EventArgs e)
{
Page.Validate("vg2");
if (!Page.IsValid)
{
TextBox tb1 = (TextBox)sender;
IFormatProvider culture = new CultureInfo("en-AU", true);
//if page is not valid, then validate the date here and default it to today''s date & time,
String[] formats = { "dd MM yyyy HH:mm", "dd/MM/yyyy HH:mm", "dd-MM-yyyy HH:mm" };
DateTime dt1;
DateTime.TryParseExact(tb1.Text, formats, culture, DateTimeStyles.AdjustToUniversal, out dt1);
if (dt1.ToShortDateString() != "1/01/0001")
tb1.Text = dt1.ToShortDateString() + " " + dt1.ToShortTimeString();
else
tb1.Text = DateTime.Today.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
}
}
Y también necesita que el servidor valide para CustomValidator
. ¡En mi caso, TextBox tiene que aceptar una fecha y hora!
Así que aquí está el marcado ...
<asp:CustomValidator ID="CustomValidator3" runat="server" ControlToValidate="txtLeft" ErrorMessage="Invalid date & time format (dd/MM/yyyy HH:mm)"
SetFocusOnError="true" ValidationGroup="vg2" OnServerValidate="CustomValidator_DateTime"></asp:CustomValidator>
Y aquí está el código detrás ...
protected void TextBoxChanged_DateTimeTest(object sender, EventArgs e)
{
Page.Validate("vg2");
if (!Page.IsValid)
{
TextBox tb1 = (TextBox)sender;
IFormatProvider culture = new CultureInfo("en-AU", true);
//if page is not valid, then validate the date here and default it to today''s date & time,
String[] formats = { "dd MM yyyy HH:mm", "dd/MM/yyyy HH:mm", "dd-MM-yyyy HH:mm" };
DateTime dt1;
DateTime.TryParseExact(tb1.Text, formats, culture, DateTimeStyles.AdjustToUniversal, out dt1);
if (dt1.ToShortDateString() != "1/01/0001")
tb1.Text = dt1.ToShortDateString() + " " + dt1.ToShortTimeString();
else
tb1.Text = DateTime.Today.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
}
}
¡Buena suerte!