Page_ClientValidate проверяется несколько раз. - PullRequest
16 голосов
/ 09 июня 2009

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

Пожалуйста, помогите. Вот код

function validate() //javascript function
{
    if (typeof(Page_ClientValidate) == 'function') 
    {
        var isPageValid = Page_ClientValidate();
        if(isPageValid)
        {
        }
    }
}

<asp:Button ID="btn1" runat="server" OnClientClick="validate()" Text="button"
                    ValidationGroup="ContactGroup" />

<asp:ValidationSummary ID="ValidationSummary1" runat="server" DisplayMode="List" 
                    ShowMessageBox="true" ShowSummary="false" ValidationGroup="ContactGroup" />

Ответы [ 8 ]

23 голосов
/ 17 июня 2010

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

В вашем случае функция срабатывает дважды: один раз для groupname = "ContactGroup" и другой раз для groupname = ""

вы должны изменить

var isPageValid = Page_ClientValidate();

до

var isPageValid = Page_ClientValidate('');

если вы не хотите указывать группу ValidationGroup или если вы хотите указать имя группы, вам нужно вызвать Page_ClientValidate следующим образом:

var isPageValid = Page_ClientValidate('ContactGroup');
5 голосов
/ 18 января 2010

Привет. Прежде всего вы должны потерять ValidationGroup = "ContactGroup" из кнопки, потому что наличие группы проверки в ней сначала вызовет проверку на странице, а затем событие OnClientClick, которое содержит функцию validate, которая вызовет проверку страницы. еще раз.

Затем вы должны передать группу проверки «ContactGroup» в функцию Page_ClientValidate (), чтобы она знала, какие элементы управления проверять, потому что простой вызов Page_ClientValidate () проверит все элементы управления независимо от их группы проверки (и может отобразить сообщение проверки больше чем один раз, в зависимости от того, сколько групп проверки у вас есть).

Короче сделайте что-то вроде этого:

function validate() //javascript function
{
    if (typeof(Page_ClientValidate) == 'function') 
    {
        var isPageValid = Page_ClientValidate('ContactGroup');
        if(isPageValid)
        {
          //your custom code
        }
    }
}    

<asp:textbox id="txtMyBox" runat="server"/>
<asp:requiredFieldValidator Id="rfv1" runat="server" ControlToValidate="txtMyBox"
ValidationGroup="ContactGroup" ErrorMessage="Bad!"/>

<asp:Button ID="btn1" runat="server" OnClientClick="validate()" Text="button"/>

<asp:ValidationSummary ID="ValidationSummary1" runat="server" DisplayMode="List" 
                    ShowMessageBox="true" ShowSummary="false" ValidationGroup="ContactGroup" />
3 голосов
/ 27 января 2010

просто верните false из функции и измените OnClientClick, как показано ниже:

<asp:Button ID="btn1" runat="server" OnClientClick="return validate();" Text="button" 
                        ValidationGroup="ContactGroup" /> 

        function validate() //javascript function   
        {   
            if (typeof(Page_ClientValidate) == 'function')    
            {   
                var isPageValid = Page_ClientValidate();   
                if(isPageValid)   
                {   
                }   
            }   
        return false;

} 
2 голосов
/ 28 сентября 2011

Вы можете выполнить проверку без показа сообщений, используйте следующий сегмент кода, затем используйте переменную isPageValid:

 if (Page_ValidationSummaries && Page_ValidationSummaries[0] && Page_ValidationSummaries[0].showmessagebox) {
            var showMessagesOption = Page_ValidationSummaries[0].showmessagebox;
            Page_ValidationSummaries[0].showmessagebox = "False";
            isPageValid = Page_ClientValidate();
            Page_ValidationSummaries[0].showmessagebox = showMessagesOption;
        }
2 голосов
/ 09 июня 2009

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

Установите кнопки Причины проверки на true. Это запустит проверку.

1 голос
/ 09 июня 2009

Удалите событие нажатия кнопки, которое, по-моему, вызывает повторную проверку.

0 голосов
/ 28 мая 2014

Я знаю, что это старый пост, но вот решение, которое может быть более гибким. Как и другие предложения пользователей, это решение принимает группу проверки, которая по умолчанию передается элементами управления проверкой asp.net. Таким образом, вам не нужно добавлять OnClientClick="validate()" в элемент управления Button.

//Make sure the Page_ClientValidate function exists
if (typeof (Page_ClientValidate) == "function") {
    //Stash the old implementation in a temp variable
    Page_ClientValidateOld = Page_ClientValidate;

    //Create a new implementation and store it
    //in Page_ClientValidate. Callers will now get
    //this implementation.
    Page_ClientValidate = function (validationGroup) {
        var isValid;

        //Call the old implementation first…
        isValid = Page_ClientValidateOld(validationGroup);

        //and then call our extension
        if (!isValid) {
            // Do something
        }

        return isValid;
    }
}

Если вы хотите узнать больше об этом подходе, я рекомендую вам посмотреть этот пост в блоге: http://hyperthink.net/blog/interception-patterns-in-javascript/

0 голосов
/ 09 июня 2009

удалить событие onclientclick кнопки, в котором нет необходимости

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