Пользовательский валидатор не срабатывает, если контроль не был заполнен
У меня такое чувство, что это может быть очень простая проблема, но не может для меня понять, что я понял.
У меня есть 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), поэтому он срабатывает при редактировании и отмене, но не при первой нагрузке.
один способ - инициализировать значение текстового поля пустой строкой в событии загрузки формы
но я думаю, что вы можете решить свою проблему, используя необходимый валидатор полей с пользовательским валидатором, который лучше подходит.