validator validar validacion usar tag net for ejemplos ejemplo controles como asp asp.net customvalidator validationsummary

asp.net - validar - tag helpers asp net core



Una forma elegante de hacer que CustomValidator funcione con el cuadro de mensajes de ValidationSummary (7)

Deberias escribir una propiedad

ValidationGroup="ValidationSummary1"

en cada validador en su caso.

Comprueba también si tu página tiene

AutoEventWireup="true"

Me he encontrado con este problema antes, pero nunca lo resolví del todo. Tengo un formulario con varios validadores y también un CustomValidator.

<asp:Label ID="lblMemberNum" runat="server" Text="Membership #:" CssClass="LabelMedium" ></asp:Label> <asp:TextBox ID="txtMemberNum" runat="server" CssClass="TextBox" ></asp:TextBox> <asp:RequiredFieldValidator ID="rfvMemberNum" SetFocusOnError="True" runat="server" ControlToValidate="txtMemberNum" ErrorMessage="[ Membership # ] is required" CssClass="ValidationMessage" Display="Dynamic" >*</asp:RequiredFieldValidator> <asp:RegularExpressionValidator ID="revMemberNum" Display="Dynamic" runat="server" ControlToValidate="txtMemberNum" CssClass="ValidationMessage" ErrorMessage="[ Membership # ] can only contain letters" ValidationExpression="^([a-zA-Z/d]+)$" >*</asp:RegularExpressionValidator> <asp:CustomValidator ID="cvMemberNum" runat="server" CssClass="ValidationMessage" Display="Dynamic" ControlToValidate="txtMemberNum" ValidateEmptyText="false" OnServerValidate="cvMemberNum_Validate" ErrorMessage="This membership number is already registered">*</asp:CustomValidator> <asp:ValidationSummary ID="ValidationSummary1" runat="server" CssClass="ValidationMessage" ShowMessageBox="True" ShowSummary="False" />

y en el lado del servidor:

protected void cvMemberNum_Validate(object source, ServerValidateEventArgs args) { try { args.IsValid = (!CampaignRegistration.IsMemberRegistered(args.Value)); } catch { args.IsValid = false; } }

Mi problema es que: ValidationSummary nunca muestra el mensaje de CustomValidator. Esta pregunta se ha hecho en varios lugares, pero no he visto una respuesta satisfactoria.


Esto funcionó para mí:

<asp:CustomValidator runat="server" ID="cv" ClientValidationFunction="ValidateFunction" ErrorMessage="Default error message">*</asp:CustomValidator> <script type="text/javascript"> function ValidateFunction(sender, args) { var msg =''''; var formValid = true; [various checks setting msg and formValid] if (msg.length > 0) { sender.errormessage = msg; } args.IsValid = formValid; } </script>


He encontrado una solución alternativa para cuando javascript está deshabilitado y el ValidationSummary no muestra la propiedad errorMessage del CustomValidator . Esto es necesario ya que las secuencias de comandos o alertas de inyección, como se describe anteriormente, no funcionarán.

Agregue un nuevo control Validator, llamémoslo CustomValidatorProxy , establezca su propiedad ControlToValidate en cualquiera de los controles en el formulario y EnableClientScript=false .

Dentro del ServerValidate eventos ServerValidate , realice su validación personalizada y, si la validación falla, establezca la propiedad IsValid del CustomValidator y CustomValidatorProxy en false y establezca de forma similar ambas propiedades ErrorMessage .

Si se pasa la validación en ServerValidate asegúrese de que la propiedad IsValid de CustomValidatorProxy esté establecida en true.

Siempre que el CustomValidatorProxy sea ​​anterior al CustomValidator en el ValidatorCollection de la página, entonces el controlador ServerValidate anulará el valor de la propiedad IsValid que el CustomValidatorProxy habría devuelto al haber validado el ControlToValidate value y su ErrorMessage de su CustomValidator se mostrará en el ValidationSummary .


Intente usar una propiedad ValidationGroup en todos sus validadores y el resumen de validación.

EDITAR: Otra posibilidad podría ser el Código de Validación del Servidor.

args.IsValid = (!CampaignRegistration.IsMemberRegistered(args.Value));

si CampaignRegistration.IsMemberRegistered(args.Value) devuelve falso, "!" lo está haciendo realidad y por lo tanto lo hace válido. Creo que deberías deshacerte del "!" como sigue:

args.IsValid = CampaignRegistration.IsMemberRegistered(args.Value);

ACTUALIZACIÓN: para que el resumen de validación muestre su mensaje de validación personalizado en un buzón de mensajes, debe tener ClientValidationFunction código de función de ClientValidationFunction . Si necesita mostrar solo el resumen sin una ventana emergente, no es necesario.

<asp:CustomValidator ID="cvMemberNum" runat="server" CssClass="ValidationMessage" Display="Dynamic" ControlToValidate="txtMemberNum" ValidateEmptyText="false" OnServerValidate="cvMemberNum_Validate" ClientValidationFunction = "ClientValidate" ErrorMessage="This membership number is already registered">*</asp:CustomValidator> //JavaScript Code. function ClientValidate(source, args) { args.IsValid = false; //you need to add validation logic here }

MÁS: Si no desea realizar la Validación de ClientSide, pruebe este truco para mostrar la alerta. Realice este cambio en su método CustomValidator ServerValidate:

protected void cvMemberNum_Validate(object source, ServerValidateEventArgs args) { bool isValid = true; try { isValid = (!CampaignRegistration.IsMemberRegistered(args.Value)); } catch { isValid = false; } args.IsValid = isValid; if(!isValid) { if(!Page.IsClientScriptBlockRegistered("CustomValidation")) Page.RegisterClientScriptBlock("CustomValidation", "<script>alert(''This membership number is already registered'');</script>"); } }


La opción ShowMessageBox es totalmente del lado del cliente, por lo que solo se evaluará si ha configurado la función ClientValidationFunction en el CustomValidator .

También puede falsificarlo registrando un script que emita una alerta, de modo que cuando vuelva de la validación del servidor, aparecerá un mensaje de error. Esto se puede registrar en el método ServerValidate (según @Jose Basilio ), o puede llamar al siguiente método durante el evento PreRender para registrar una ventana emergente con todos los validadores no válidos en la página:

/// <summary> /// Registers a script to display error messages from server-side validation as the specified <see cref="UserControl"/> or <see cref="Page"/> loads from a postback. /// </summary> /// <remarks> /// Must be called in the PreRender if used to validate against the Text property of DNNTextEditor controls, otherwise Text will not be populated. /// Must set the ErrorMessage manually if using a resourcekey, otherwise the resourcekey will not have overridden the ErrorMessage property. /// </remarks> /// <param name="ctrl">The <see cref="UserControl"/> or <see cref="Page"/> which is being posted back.</param> /// <param name="validationGroup">The validation group against which to validate.</param> public static void RegisterServerValidationMessageScript(TemplateControl ctrl, string validationGroup) { if (ctrl != null && ctrl.Page.IsPostBack) { ctrl.Page.Validate(validationGroup); if (!ctrl.Page.IsValid) { StringBuilder errorMessage = new StringBuilder("<script language=''javascript''>alert(''"); for (int i = 0; i < ctrl.Page.Validators.Count; i++) { IValidator validator = ctrl.Page.Validators[i]; if (!validator.IsValid) { errorMessage.Append("- " + validator.ErrorMessage); if (i < ctrl.Page.Validators.Count - 1) { errorMessage.Append(@"/r/n"); } } } errorMessage.Append("'');</script>"); ctrl.Page.ClientScript.RegisterStartupScript(typeof(IValidator), "validationAlert", errorMessage.ToString(), false); } } }


Recientemente he tenido el mismo problema. ValidationSummary no mostraba el ErrorMessage de CustomValidator cuando ServerValidate declaró un error de validación. Dado que, de manera predeterminada (como lo mostró mi pequeña ingeniería inversa), el resumen de validación se presenta en el lado del cliente en la devolución de datos, simplemente he agregado un script que verifica todos los validadores en la finalización de la devolución de documentos / asíncrono de documentos y activa la creación del resumen de validación para los grupos de validación fallidos:

$(document).ready(function () { var displayAlert = function () { if (typeof Page_Validators == ''undefined'') return; var groups = []; for (i = 0; i < Page_Validators.length; i++) if (!Page_Validators[i].isvalid) { if (!groups[Page_Validators[i].validationGroup]) { ValidationSummaryOnSubmit(Page_Validators[i].validationGroup); groups[Page_Validators[i].validationGroup] = true; } } }; displayAlert(); Sys.WebForms.PageRequestManager.getInstance().add_endRequest( function () { displayAlert(); }); } );

En mi caso, tenía controles de usuario anidados con validadores, panel de actualización y resumen de validación en la página principal.

Más detalles aquí.


bduke´s RegisterServerValidationMessageScript está "falsificándolo", pero no lo es. Realmente soluciona el problema. Todo espacio de nombres de utilidad necesita esta función en algún lugar.