Estoy usando el javascript de la respuesta en esta pregunta en un proyecto mío:

Agregar hipervínculos a ValidationSummary

Funciona muy bien. Lo agregué al final de mi página maestra (por alguna razón, aunque está dentro de $ (document) .ready, Page_Validators es nulo si lo coloco en la sección del encabezado)

¡De todas formas! También estoy agregando algunos validadores personalizados de manera programática en la devolución de datos usando este código:

public static CustomValidator ReturnErrorMessage(string message, string validationGroup, string controlToValidate = "")
    {
        CustomValidator control = new CustomValidator();

        control.ID = "cv" + controlToValidate;
        control.IsValid = false;
        control.Text = " ";
        control.ValidationGroup = validationGroup;
        control.ErrorMessage = message;
        control.ControlToValidate = controlToValidate;

        return control;
    }

Sin embargo, cada vez que agrego un CustomValidator como ese, en un evento de botón, page_load o lo que sea, Page_Validators se anulará y el mensaje de error volverá al mensaje sin un ancla.

¿Lo que da? ¿Estoy haciendo algo mal o alguien puede explicar lo que está sucediendo?

Intenté depurarlo y establece los valores correctamente, pero luego simplemente se restablece.

Lo intenté y en $ (document) .ready configuré todos los validadores como isvalid = false, y eso también se sobrescribe.

Estoy usando la validación discreta de asp.net 4.5, pero no importa si lo apago.

Agregar el javascript en código utilizando Page.ClientScript.RegisterStartupScript en algún momento después de que se haya creado el validador tampoco funciona.

Si no agrego ningún validador en el código, todo funciona como se esperaba.

Soy consciente de que puedo simplemente agregar las etiquetas de anclaje manualmente, pero es mucho trabajo actualizar los validadores existentes en lugar de simplemente lanzar un pequeño script, así que espero que esto funcione.

Puede usar este código para probar esto:

using System;
using System.Web.UI.WebControls;    

public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        CustomValidator control = new CustomValidator();

        control.ID = "cv" + txtName.ClientID;
        control.IsValid = false;
        control.Text = " ";
        control.ValidationGroup = "errorGroup";
        control.ErrorMessage = "Error message";
        control.ControlToValidate = txtName.ClientID;

        Form.Controls.Add(control);
    }
}
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebForm1" %>

  <!DOCTYPE html>

  <html xmlns="http://www.w3.org/1999/xhtml">

  <head runat="server">
    <title></title>
    <script src="jquery-3.3.1.min.js"></script>
  </head>

  <body>
    <form id="form1" runat="server">
      <div>
        <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
        <asp:ValidationSummary ID="vsSummary" runat="server" ValidationGroup="errorGroup" ForeColor="Red" HeaderText="Error!" />
      </div>
    </form>
    <script>
      $(document).ready(function() {
        var validators = Page_Validators; // returns collection of validators on page

        $(validators).each(function() {
          //get target control and current error validation message from each validator
          //[0] is needed when using aspnet 4.5 unobtrusive validation
          var validator = $(this)[0];

          var errorMsg = validator.errormessage;
          var targetControl = validator.controltovalidate;

          //make link only if theres a control to target
          if (targetControl) {
            var errorMsgWithLink = "<a href='#" + targetControl + "' style='color: #FF3232;'> " + errorMsg + "</a>";

            //update error message with anchor tag
            validator.errormessage = errorMsgWithLink;
          }
        });
      });
    </script>
  </body>

  </html>
0
Gucchi 16 oct. 2018 a las 07:14

2 respuestas

La mejor respuesta

Terminé usando un método de extensión, agregando la etiqueta de anclaje en el método

public static void AddValidator(this Page p, string message, string validationGroup, string controlToValidate = "", bool addAnchorTags = true)
    {
        CustomValidator control = new CustomValidator();

        control.ID = "cv" + controlToValidate;
        control.IsValid = false;
        control.Text = "&nbsp;";
        control.ValidationGroup = validationGroup;
        control.ControlToValidate = controlToValidate;

        if (addAnchorTags && !string.IsNullOrEmpty(controlToValidate))
        {
            control.ErrorMessage = "<a href='#" + controlToValidate + "' style='color: #FF3232;'> " + message + "</a>";
        }
        else
        {
            control.ErrorMessage = message;
        }

        p.Validators.Add(control);
    }
0
Gucchi 1 nov. 2018 a las 05:00

Si lo desea, puede intentar implementar su propio control 'CustomValidationSummary' siguiendo el mismo patrón de diseño que se menciona en Fuente de referencia de Microsoft y modifique el método de representación para incluir una etiqueta de anclaje para ajustar el texto del error, antes de que se pase al método de escritura en la línea número 462.

0
Hitesh Gaur 29 oct. 2018 a las 21:02