Подтверждайте город, штат и почтовый индекс только в том случае, если в качестве страны выбраны Соединенные Штаты.

Мне нужно создать пользовательский элемент управления с полями формы для страны (раскрывающийся список), адреса (текстовое поле), города (текстовое поле), штата (раскрывающийся список) и почтового индекса (текстовое поле). Я хочу проверить город, штат и почтовый индекс только в том случае, если в раскрывающемся списке выбрано «Соединенные Штаты». Под «проверкой» я подразумеваю проверку длины — вот и все.

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

<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, которые у меня есть для этих других полей, срабатывают. Однако, если я заполню все поля, кроме «Город», «Штат» и «Почтовый индекс» (выбрав США в качестве страны), форма будет отправлена, не обнаружив, что они пусты.

Если я укажу как клиентскую, так и серверную проверку для моего пользовательского валидатора (как в приведенном выше примере), ни один из валидаторов не будет запущен, и форма будет отправлена.

Я понимаю, что это может быть длинный и запутанный пост, но есть ли какие-нибудь идеи о том, где я ошибаюсь?


person esvendsen    schedule 28.01.2011    source источник
comment
Вы можете принудительно выполнить проверку страницы, используя Page.Validate() при обратной передаче.   -  person Jacob Proffitt    schedule 29.01.2011


Ответы (1)


Трудно сказать, что пошло не так с RequiredFieldValidators, поскольку их нет в примере (вы указали, какой элемент управления проверять?), но вот пример, который, надеюсь, вам поможет:

protected void LocationValidator_ServerValidate(object source, ServerValidateEventArgs args)
        {
            args.IsValid = IsCountryValid();
        }

        private bool IsCountryValid()
        {
            if (Country.SelectedValue == "US")
            {
                if (String.IsNullOrEmpty(City.Text))
                    return false;

                if (String.IsNullOrEmpty(State.SelectedValue))
                    return false;

                if (String.IsNullOrEmpty(Zip.Text))
                    return false;
            }
            else if (String.IsNullOrEmpty(Country.SelectedValue))
            {
                return false;
            }

            return true;
        }

Я изменил отображение на «динамическое», чтобы увидеть сообщение:

<asp:CustomValidator ID="LocationValidator" runat="server" 
            ErrorMessage="City, State, and Zip are required fields" Display="Dynamic" 
            OnServerValidate="LocationValidator_ServerValidate"></asp:CustomValidator>

Если у вас есть значения вместо пустых строк в раскрывающемся списке, то, очевидно, измените проверку для них, но я надеюсь, что это поможет!

person annelie    schedule 01.02.2011
comment
круто, это работает. другим ключом было добавление группы проверки в customvalidator. Затем я выполнил Page.Validate(validationgroup) и if (!IsValid) изнутри Page_Load, где я вызывал этот пользовательский элемент управления. Я дам вам ответ, так как вы помогли мне с логикой - спасибо! - person esvendsen; 03.02.2011
comment
Рад, что смог помочь! И спасибо, это был мой первый принятый ответ. :) - person annelie; 04.02.2011