Пользовательский валидатор не срабатывает, если контроль не был заполнен

У меня такое чувство, что это может быть очень простая проблема, но не может для меня понять, что я понял.

У меня есть asp: textbox. У меня есть специальный валидатор, на котором есть проверка на стороне клиента и сервера.

Вот код:

<asp:TextBox ID="txtFirstName" runat="server"></asp:TextBox>

<asp:CustomValidator ID="vldFirstName" runat="server" ControlToValidate="txtFirstName"
    ClientValidationFunction="ValidateName" OnServerValidate="vldFirstName_ServerValidate"
    Text="Please put in your first name" ErrorMessage="First name missing"
    ForeColor="Red" font-bold="true" Display="Dynamic"
    ValidateEmptyText="true">
</asp:CustomValidator>

Это будет корректно проверяться на стороне сервера, если я просто перейду прямо к моей странице и нажмите "Отправить", оставив текстовое поле пустым.

Однако с проверкой на стороне клиента. Если я войду в коробку и выйду из нее, не набрав ничего. Проверка javascript не срабатывает. Если я тогда что-то наберу. Оставьте поле. Вернитесь назад, а затем снимите флажок с проверки. Он возвращается, говоря, что он пуст.

Однако я хочу, чтобы он был как только они вошли в коробку, и оставьте это. Я не уверен, почему валидатор не стреляет, если текстовое поле было нетронутым.

Ответ 1

Поместите script ниже в любом месте вашего веб-формы, и он будет работать так, как вы хотите:

document.addEventListener('DOMContentLoaded', function() {
  [].forEach.call(document.querySelectorAll('input'), function(el, i) {
    el.addEventListener('blur', ValidatorOnChange);
  });
});

Валидатор не работает изначально так, как вы хотите, потому что он прикрепляет обработчик событий onchange к TextBoxes, поэтому, если вы вообще не меняете текст, вы не получите подтверждение.

Но если вы вынуждаете все текстовые поля запускать одно и то же событие onblur, то, измените ли вы текст или нет, оно вызовет проверку, и что делает script выше: добавив, что обработчик событий для всех текстовых полей на странице и вызов функции ValidatorOnChange, когда это происходит.

Примечание. Если у вас уже есть script, который вызывается в каждом WebForm, который у вас есть в вашем приложении, и вы хотите, чтобы это поведение работало повсюду, вы можете добавить код в этот script (где-нибудь внутри него), и решение будет распространяться на все ваши веб-формы.

Ответ 2

Я тестировал этот код со случайной проверкой клиента, и проверка не срабатывала должным образом.

Я добавил беспрепятственные элементы:

  • Загрузка на страницу: (или вы хотите ее активировать)

    protected void Page_Load(object sender, EventArgs e)
    {
        Page.UnobtrusiveValidationMode = UnobtrusiveValidationMode.WebForms;
    }
    
  • Убедитесь, что загружен jquery:

на global.asax:

 protected void Application_Start(object sender, EventArgs e)
        {
            ScriptManager.ScriptResourceMapping.AddDefinition("jquery",
            new ScriptResourceDefinition
        {
          Path = "~/scripts/jquery-2.1.4.min.js",
          DebugPath = "~/scripts/jquery-2.1.4.js",
          CdnPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.0.min.js",
          CdnDebugPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.0.js"
        });
        }

После того, как эти два обновления были обновлены (и у меня есть submit btn), он работал хорошо.

SO, проверьте, загружена ли свободная проверка и загружен ли загрузочный jquery.

Ответ 3

Вам нужно позвонить

if (Page.IsValid)

на обратной стороне на сервере, иначе проверка вашего сервера не будет вызываться. RequiredFieldValidator проверяет на клиенте, почему он работает. Однако вы всегда должны проверять и на сервере.

Для проверки на стороне клиента вам необходимо написать метод JavaScript, который делает то же самое. Вы устанавливаете атрибут в своем CustomValidator:

ClientValidationFunction = "YourValidationMethod"

и метод делает что-то вроде этого

function YourValidationMethod(source, args)
{

   if (valid) // do check here
     args.IsValid = true;
  else
     args.IsValid = false;
}

Ответ 4

Я считаю, что CustomValidators по дизайну предназначены для работы отдельно от RequiredFieldValidators, и для них нормально не запускать пустые поля.

Ответ 5

Ahh, радости веб-форм asp.net:)

Если вы используете другие элементы управления, такие как radControls, которые поставляются со своей версией jquery, это может быть одной проблемой, обязательно используйте тот, который поставляется вместе с каркасом, отключив их.

В качестве альтернативы вы можете отключить ненавязчивую проверку в файле web.config и посмотреть, не загорается ли она, когда она пуста.

 <appSettings>
  <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
</appSettings>

Ответ 6

В соответствии с документами msdn... что я могу узнать о свойстве validateEmptyText = true, это вызовет пользовательскую проверку (validateName javascipt), хотя текстовое поле пуст.

Может быть включено первое значение загрузки undefined для этого текстового поля, но при редактировании и отмене значения текстового поля теперь будет пустым. (не undefined), поэтому он срабатывает при редактировании и отмене, но не при первой нагрузке.

один способ - инициализировать значение текстового поля пустой строкой в ​​событии загрузки формы

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