0

I'm using the javascript from the answer in this question in a project of mine:

Adding Hyperlinks to ValidationSummary

It works really great. I've added it to the bottom of my masterpage (for some reason, even though it is inside $(document).ready, Page_Validators is null if i place it in the head section)

Anyway! I'm also adding some custom validators programatically on postback using this code:

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

However whenever I add a CustomValidator like that, in a button event, page_load or whatever, Page_Validators will be overridden and the errormessage will revert to the message without a anchor.

What gives? Am I doing something wrong or can someone explain what is happening?

I've tried debugging it and it does set the values correctly, but then it just reset afterwards.

I've tried for the heck of it and in $(document).ready set all validators as isvalid = false, and that gets overwritten too.

Im using asp.net 4.5 unobtrusive validation, but it does not make a difference if I turn it off.

Adding the javascript in code using Page.ClientScript.RegisterStartupScript at some point after the validator has been created does not work either.

If I don't add any validators in code everything works as expected.

I'm aware I can just add the anchor tags manually, but this is a lot of work to update existing validators instead of just tossing in a small script, so I'm hoping to get this to work.

You can use this code to test this:

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>
Gucchi
  • 33
  • 7

2 Answers2

0

If you want you can try implementing your own 'CustomValidationSummary' control by following the same design pattern as mentioned at Reference Source by Microsoft, and modify the render method to include anchor tag to wrap error text, before it is passed into the writer method at line number 462.

  • I like the approach, although I ended up changing the current code slightly instead. Mostly I'm curious to why the Page_Validators gets overwritten – Gucchi Nov 01 '18 at 05:02
0

I ended up using a extension method, adding the anchor tag in the method

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);
    }
Gucchi
  • 33
  • 7