Проверка на стороне клиента: ручная обратная передача с помощью JavaScript eval () - PullRequest
2 голосов
/ 08 марта 2010

Я допускаю некоторую проблему обратной передачи при использовании GetPostBackEventReference . Вот сценарий :

У меня есть всплывающее диалоговое окно модального javascript, и я получил кнопку в этом модальном диалоге, которая использовалась для выбора вещей (это НЕ элемент управления asp: button)

При нажатии кнопки HTML этого диалогового окна javascript он вызовет вызов веб-службы MS AJAX с помощью метода javascript: eval () . И этот вызов веб-службы MS AJAX генерируется динамически. Итак, код такой:

var serviceCall = svcCall + "(" + parameters + ")";   //dynamically generate the MS AJAX web service call here
eval(serviceCall);    

                                              //use eval to trigger the MS AJAX web service call

Как вы все знаете, после завершения веб-службы MS AJAX вы можете определить функцию обратного вызова для обработки завершения:

function OnComplete(result, userContext, methodName) {

    //force to call postback manually
    eval($(userContext[0]).val());

    //close the javascript dialog here
}

Как я уже упоминал ранее, вызов веб-службы MS AJAX создается динамически, и когда вызов веб-службы MS AJAX является конструктивным, он будет передавать userContext, который содержит значение обратной передачи (т. Е. " __ doPostBack (' ctl00 $ ContentPlaceHolder1 $ btnSelectUser ',' ')", поэтому, когда вызывается javascript eval () , он имитирует обратную передачу по нажатию кнопки asp:.

userContext [0] в основном содержит идентификатор клиента скрытого поля asp: hidden, а значение скрытого поля задается во время события Page_Load:

protected void Page_Load(object sender, EventArgs e)
{
        btnSelectUser.ValidationGroup = "popupSelect";
        btnSelectUser.CausesValidation = false;
        this.hdnBtnPostback.Value = Page.ClientScript.GetPostBackEventReference(btnSelectUser, string.Empty, false);
}

Как вы можете видеть, вот как я связал событие Click кнопки asp: (т.е. btnSelectUser) с скрытым полем asp: с помощью GetPostBackEventReference и установил registerForEventValidation аргумент в ложь. Я также пытался использовать другую ValidationGroup и установить CausesValidation в false , но без надежды. (

В итоге, я связал нажатие кнопки asp: PostBackEventReference (т.е. __doPostback (....)) с атрибутом Value поля asp: hidden и используя javascript eval () для оценки этого скрытого поля значение для ручного запуска обратной передачи.

p.s. btnSelectUser является элементом управления asp: button и используется для вызова модального диалогового окна javascript.

Хорошо, вот проблема:

На той же странице есть некоторый asp: validator, например и, конечно же, когда страница сталкивается с ошибкой, этот валидатор и выноска будут отображаться для пользователя. например Когда пользователь ничего не заполнил и не отправил форму, ValidatorCalloutExtender отобразит баллон и сообщит пользователю. Представьте себе, что один из этих ballon / validatorCalloutExtender выходит на верх вашего экрана в данный момент.

Затем вы щелкаете btnSelectUser (asp: кнопка), чтобы отобразить модальное диалоговое окно javascript, и в диалоговом окне вы добавляете несколько пользователей, и после нажатия кнопки SELECT в этом модальном диалоговом окне веб-служба MS AJAX запускается как как было упомянуто выше, и после завершения этого веб-сервиса, он оценивает значение поля asp: hidden (т. е. __doPostback (...)) ...... и выполняет обратную передачу вручную.

Однако из-за отображения баллона validatorCalloutExtender он каким-то образом не может инициировать обратную передачу таким образом, но когда я закрываю ballon / validatorCalloutExtender, ручная обратная передача с использованием eval () просто работает нормально. Еще более странным является то, что при отображении баллона первый раз, когда я нажимаю кнопку SELECT в этом модальном диалоговом окне, он не запускает обратную передачу, однако, если я делаю то же самое снова (т. Е. Открываю диалог javascript и выберите некоторых пользователей, затем снова нажмите кнопку SELECT). Он может выполнять ручную обратную передачу .... и я не понимаю, почему первый раз не работает.

Это действительно сводит меня с ума, надеюсь, кто-нибудь здесь может помочь, будет очень признателен. Большое вам спасибо, ребята. :)

Хорошего дня. Будем рады услышать от вас все в ближайшее время.

1 Ответ

1 голос
/ 02 июня 2010

Когда вы звоните __doPostBack(eventTarget, eventArgument), запускается отправка формы:

Это сообщение будет продолжено, если WebForm_OnSubmit(); вернет true.

WebForm_OnSubmit результат зависит от ValidatorOnSubmit результата, который, в свою очередь, зависит от

ValidatorCommonOnSubmit результат, если Page_ValidationActive == true.

Теперь, если вы все еще со мной, как в функции ниже:

function ValidatorCommonOnSubmit() {
    Page_InvalidControlToBeFocused = null;
    var result = !Page_BlockSubmit;
    if ((typeof(window.event) != "undefined") && (window.event != null)) {
        window.event.returnValue = result;
    }
    Page_BlockSubmit = false;
    return result;
}

Результат ValidatorCommonOnSubmit зависит от Page_BlockSubmit, поэтому единственное, что блокирует вашу обратную передачу, это Page_BlockSubmit == true, это не имеет ничего общего с проверочными выносками.

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

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