Мне нужно создать пользовательский элемент управления с полями формы для страны (раскрывающийся список), адреса (текстовое поле), города (текстовое поле), штата (раскрывающийся список) и почтового индекса (текстовое поле). Я хочу проверить город, штат и почтовый индекс только в том случае, если в раскрывающемся списке выбрано «Соединенные Штаты». Под «проверкой» я подразумеваю проверку длины — вот и все.
Я пытался использовать пользовательские валидаторы, но что-то упустил, потому что код, который, казалось бы, должен работать, ничего не делает. Пример:
<asp:CustomValidator ErrorMessage="City, State, and Zip are required fields"
Display="None" ID="LocationValidator"
runat="server" ClientValidationFunction="validateLocation"
onservervalidate="LocationValidator_ServerValidate">
</asp:CustomValidator>
Тогда вот мой код проверки
Проверка на стороне клиента:
function validateLocation(sender, args) {
var country = jQuery("#main_2_MailingAddress_Country").val();
var city = jQuery("#main_2_MailingAddress_City").val();
if (city.Length() > 0)
{
args.IsValid = true;
}
else
{
args.IsValid = country != "United States";
}
}
Проверка на стороне сервера:
protected void LocationValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
if (City.Text.Length > 0)
{
args.IsValid = true;
}
else //nothing was entered for "City"
{
args.IsValid = Country.SelectedValue != "United States";
}
//similar functions for State and Zip go here
}
Если я выполняю только проверку на стороне сервера и ничего не заполняю в форме (есть другие обязательные поля, кроме полей адреса), то RequiredFieldValidators, которые у меня есть для этих других полей, срабатывают. Однако, если я заполню все поля, кроме «Город», «Штат» и «Почтовый индекс» (выбрав США в качестве страны), форма будет отправлена, не обнаружив, что они пусты.
Если я укажу как клиентскую, так и серверную проверку для моего пользовательского валидатора (как в приведенном выше примере), ни один из валидаторов не будет запущен, и форма будет отправлена.
Я понимаю, что это может быть длинный и запутанный пост, но есть ли какие-нибудь идеи о том, где я ошибаюсь?