Как предотвратить исключения из отправки форм половинно загруженных страниц при использовании проверки событий asp.net? - PullRequest
5 голосов
/ 31 октября 2008

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

Invalid postback or callback argument. 
Event validation is enabled using in configuration or in a page. For

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

Я предполагаю, что поле Viewstate еще не загружено в форму, остальные биты отправляются. Как лучше всего предотвратить эту ошибку, сохраняя при этом проверку событий?

Ответы [ 5 ]

4 голосов
/ 31 октября 2008

Я ответил на аналогичный вопрос здесь . Цитировать:

По сути, вы хотите, чтобы ViewState загружался вверху страницы. В .NET 3.5 SP1 свойство RenderAllHiddenFieldsAtTopOfForm было добавлено в конфигурацию PagesSection.

Web.config

<configuration>

    <system.web>

        <pages renderAllHiddenFieldsAtTopOfForm="true"></pages>

    </system.web>

</configuration>

Интересно, что по умолчанию это значение true. Таким образом, по сути, если вы используете .NET 3.5 SP1, то ViewState автоматически отображается в верхней части формы (до загрузки остальной части страницы), тем самым устраняя полученную ошибку ViewState.

2 голосов
/ 04 ноября 2008

Я обнаружил, что это вызвано более часто полем __EVENTVALIDATION, чем ViewState не загружается. __EVENTVALIDATION находится внизу страницы, и если он не был получен клиентом, когда пользователь вызвал обратную передачу, вы получите это исключение.

Я еще не нашел отличного решения, но то, что я обычно делаю на страницах, которые обычно вызывают это из-за большого количества контента, - это связывание кнопок с функцией JavaScript, которая проверяет переменную isLoaded, которая только устанавливается истина в документе. уже звоните. Если isLoaded имеет значение false, оно молча ест событие, если это правда, оно разрешает, если проходит. Это неудобно, но большинство моих проблем с обратной передачей положило конец.

0 голосов
/ 20 апреля 2016

Я потратил довольно много времени, пытаясь выяснить, почему тег __EVENTVALIDATION отображается снизу на определенном сайте, но ближе к вершине на любом другом сайте. В конце концов я понял, что это из-за кода в событии переопределения Render. Это, наряду с худым состоянием вида, в основном избавило от этой ошибки, но для большей ясности я добавил логику ниже на кнопку, которая вызывала ошибку:

JavaScript где-то на странице

function CheckForHiddenFields()
{
    var EventValidation = document.getElementById('__EVENTVALIDATION');
    if (EventValidation && EventValidation.value && EventValidation.value != '')
    {
        return true;
    }
    else
    {
        return false;
    }
}

Добавить атрибут в asp: Кнопка:

OnClientClick="return CheckForHiddenFields();"
0 голосов
/ 31 октября 2008

Из того, что я могу сказать, ViewState загружается сразу после тега формы на странице.

Вы пытались использовать ClientScriptManager.RegisterForEventValidation( button.UniqueID ) для каждой кнопки после добавления кнопки на страницу? В зависимости от того, где вы добавили кнопку, перехват событий для страницы мог уже произойти, и, следовательно, события, сгенерированные кнопкой, могут не регистрироваться на странице.

0 голосов
/ 31 октября 2008

Что если вы установите для свойства visible этих кнопок значение false по умолчанию, а в конце загрузки страницы или проверки события вы установите для свойства visible значение true? Таким образом, они не будут нажимать кнопку до тех пор, пока страница не загрузится полностью.

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