Есть ли способ заставить ValidationSummary работать с валидаторами на стороне клиента? - PullRequest
9 голосов
/ 07 декабря 2009

Элемент управления .NET ValidationSummary собирает сообщения об ошибках от валидаторов, которые запускаются при обратной передаче. Есть ли способ заставить его также отображать сообщения об ошибках от клиентских валидаторов?

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

Мне бы хотелось, чтобы любые стандартные валидаторы .NET, имеющие валидацию на стороне клиента, были отражены в сводке валидации, но меня больше всего интересует, как работают RequiredFieldValidators.

Я мог бы взломать его так, чтобы при нажатии кнопки автоматически, через короткую задержку, отображалось общее сообщение, в котором пользователю предлагалось проверить ошибки на странице. Это сработает, если обратной передачи не произошло, но будет ужасно.

Вот пример кода, который не работает для меня:

<asp:LinkButton ID="btnOpen" runat="server" ToolTip="Open" ValidationGroup="Create" CausesValidation="true" />
<asp:TextBox ID="txtBlah" runat="server" />
<asp:RequiredFieldValidator ID="reqBlah" runat="server" ControlToValidate="txtBlah" EnableClientScript="true" Display="Dynamic" ErrorMessage="Enter some blah" ValidationGroup="Create" />
<asp:ValidationSummary ID="summary" runat="server" EnableClientScript="true" DisplayMode="BulletList" HeaderText="Errors:" ShowMessageBox="true" ShowSummary="true" ValidationGroup="Create" />

Валидатор показывает ошибку без обратной передачи, а сводка - нет.

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

Спасибо за попытки помочь. Я рекомендую людям больше не работать над этим вопросом, поскольку я не думаю, что предоставил достаточно информации, чтобы действительно помочь кому-либо решить проблему.

Ответы [ 7 ]

12 голосов
/ 22 января 2010

У меня тоже была эта проблема. Потратив слишком много времени на анализ API проверки на стороне клиента MS;), я проследил проблему до странной проблемы с анализом DOM, ниже я объясню, почему это происходит в некоторых случаях, и решение, которое я использовал для его устранения.

[Почему это происходит?]

Каждый элемент управления validator отображается как диапазон с нестандартными атрибутами, которые используются для выполнения проверки на стороне клиента. Например атрибут оценки функции ниже:

<span id="...id" controltovalidate="...BillingName" errormessage="blah" evaluationfunction="RequiredFieldValidatorEvaluateIsValid" display="Dynamic" initialvalue="" >*</span>

Эти атрибуты анализируются платформой в API, как показано ниже (обратите внимание на eval):

for (i = 0; i < Page_Validators.length; i++) {
  val = Page_Validators[i];
  if (typeof(val.evaluationfunction) == "string") {
     eval("val.evaluationfunction = " + val.evaluationfunction + ";");
     } 
}

проблема в том, что специальные атрибуты, т. Е. Функция оценки, мы всегда возвращаем неопределенной, чтобы строка никогда не преобразовывалась в надлежащий объект валидатора. Для меня это все еще остается загадкой, потому что из того, что я могу сказать, это кажется совершенно случайным.

Что происходит, когда запускается Page_ClientValidate, он пытается вызвать каждую функцию проверки валидаторов, но не может этого сделать, потому что functionfunction == undefined. Вместо использования false в качестве значения по умолчанию он принимает значение true, поэтому проверка на самом деле не происходит, и все кажется действительным со стороны клиента. if (typeof (val.evaluationfunction) == "function") никогда не имеет значения true, поэтому он возвращается к предыдущему присваиванию val.isvalid = true; .

function ValidatorValidate(val, validationGroup, event) {
 val.isvalid = true;
 if ((typeof(val.enabled) == "undefined" || val.enabled != false) && IsValidationGroupMatch(val, validationGroup)) 
 {
  if (typeof(val.evaluationfunction) == "function") 
  {
   val.isvalid = val.evaluationfunction(val);
   if (!val.isvalid && Page_InvalidControlToBeFocused == null && typeof(val.focusOnError) == "string" && val.focusOnError == "t") 
   {
    ValidatorSetFocus(val, event);
   }
  }
 }
  ValidatorUpdateDisplay(val);
} 

[Как я это исправил?]

Чтобы исправить это, я написал подпрограмму, которую можно вызывать после завершения загрузки DOM. Эта процедура зацикливает все элементы управления валидатора и пытается создать свойства объекта из необработанных данных разметки в SPAN с использованием JQuery, хотя вы, вероятно, могли бы использовать любой другой эквивалентный инструмент для получения того же результата. Эта процедура не фиксирует все элементы управления валидатора, в основном обязательные валидаторы полей и валидаторы регулярных выражений. Вам нужно будет изменить его, если вы используете другие элементы управления проверкой, которые имеют дополнительные свойства.

function fixValidatorProperties()
{
    if (Page_Validators && Page_Validators[0] && Page_Validators[0].evaluationfunction == undefined)
    {
        var val = null;
        for (i = 0; i < Page_Validators.length; i++) 
        {
            val = Page_Validators[i];

            if (val.initialvalue == undefined)
                val.initialvalue = "";

            if ($(val).attr("evaluationfunction"))
                  eval("val.evaluationfunction = " + $(val).attr("evaluationfunction") + ";");
            if ($(val).attr("controltovalidate"))
                  val.controltovalidate = $(val).attr("controltovalidate");
            if ($(val).attr("errormessage"))
                  val.errormessage = $(val).attr("errormessage");
            if ($(val).attr("Dynamic"))
                  val.Dynamic = $(val).attr("Dynamic");     
            if ($(val).attr("initialvalue"))
                  val.initialvalue = $(val).attr("initialvalue"); 
                if ($(val).attr("ValidationExpression"))  
                  val.validationexpression =  $(val).attr("ValidationExpression");
         }     
    }
}
1 голос
/ 05 мая 2015

Для более удобного исправления ванили, добавить

ONBLUR = "ValidationSummaryOnSubmit ()"

для каждого поля ввода, защищенного контролем проверки

Для получения более подробной информации, пожалуйста, обратитесь к Сводка проверки Автообновление

1 голос
/ 08 декабря 2009

Я полагаю, что вам необходимо ввести значения в свойстве «Текст» вашего валидатора, чтобы отобразить сообщение в сводке валидации. «Сообщение об ошибке» - это текст, который отображается на странице, где находится валидатор, а свойство «Текст» - это текст, который отображается в элементе управления «Сводка проверки».

1 голос
/ 07 декабря 2009

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

0 голосов
/ 14 ноября 2013

Я знаю, что эта проблема была "решена" некоторое время назад, но я столкнулся с той же самой проблемой. Мы обновили наш сайт с .NET 3.5 до .NET 4.0, и скрипты проверки на стороне клиента перестали работать. Симптомы были в точности такими, как описал Джеймс в своем превосходном ответе.

Однако разрешение, по крайней мере для меня, было намного проще, чем то, что предоставил Джеймс. Проще говоря, xhtmlConformance в моем Web.Config было установлено на Legacy . Установка Transitional разрешит проблему для меня.

Поскольку это работало для меня, я хотел обновить эту публикацию другим решением, которое может быть проще в реализации. Обратите внимание на эту ссылку: http://weblogs.asp.net/scottgu/archive/2006/12/10/gotcha-don-t-use-xhtmlconformance-mode-legacy-with-asp-net-ajax.aspx

0 голосов
/ 07 декабря 2009

в вашей кнопке «отправить» установите «CausesValidation = true». Это заставит клиента вводить действительные данные. Если ваши элементы проверки не отображаются, более вероятно, что вы не связали их с определенным элементом управления (я полагаю ??). Вы установили свойство «ControltoValidate», чтобы требуемый валидатор поля указывал на текстовое поле / поле хотите проверить?

0 голосов
/ 07 декабря 2009

Было бы проще дать более подробный ответ, если бы вы указали , какой клиентский валидатор, который вы используете. Однако в целом это не так сложно; большинство валидаторов на стороне клиента позволяют указать, где должны отображаться сообщения проверки, и вы можете просто указать им тот же элемент HTML, где хранится элемент управления ValidationSummary

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