Добавление гиперссылок в ValidationSummary с использованием программно добавленных валидаторов - PullRequest
0 голосов
/ 16 октября 2018

Я использую javascript из ответа на этот вопрос в моем проекте:

Добавление гиперссылок на ValidationSummary

Работает действительно отлично.Я добавил его внизу своей главной страницы (по какой-то причине, даже если он находится внутри $ (document) .ready, Page_Validators имеет значение null, если я помещу его в раздел head)

В любом случае!Я также добавляю несколько пользовательских валидаторов программно при обратной передаче, используя этот код:

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

Однако всякий раз, когда я добавляю CustomValidator, подобный этому, в событии кнопки, page_load или в любом другом месте, Page_Validators будет переопределен, и сообщение об ошибке будетвернуться к сообщению без якоря.

Что дает?Я делаю что-то не так или кто-то может объяснить, что происходит?

Я попытался отладить его, и он правильно устанавливает значения, но потом просто сбрасывает.

Я пытался, черт возьми, и в $ (document) .ready установить все валидаторы как isvalid = false, и это тоже перезаписывается.

Я использую asp.net 4.5 ненавязчивопроверка, но это не имеет значения, если я ее отключу.

Добавление javascript в код с использованием Page.ClientScript.RegisterStartupScript в какой-то момент после создания валидатора также не работает.

Если я не добавляю валидаторы в код, все работает как положено.

Я знаю, что могу просто добавить теги привязки вручную, но это большая работа по обновлению существующих валидаторов вместо простогодобавив небольшой скрипт, поэтому я надеюсь, что это сработает.

Вы можете использовать этот код для проверки этого:

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>

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

В итоге я использовал метод расширения, добавив метку привязки в метод

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 голосов
/ 30 октября 2018

Если вы хотите, вы можете попробовать реализовать свой собственный элемент управления «CustomValidationSummary», следуя тому же шаблону проектирования, как указано в Reference Source от Microsoft , и изменить метод рендеринга, включив тег привязки для переноса текста ошибки,перед передачей в метод писателя в строке номер 462.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...