Группы проверки ASP.NET 3.5 не работают

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

У нас есть главная страница с ValidationSummary, которая не является частью группы проверки. На нашей странице содержимого у нас есть еще один ValidationSummary, назначенный группе проверки под названием ValReject. На странице содержимого также находится CustomValidator, который использует ClientValidationFunction и кнопку, обе из которых также назначены ValReject.

Когда я нажимаю кнопку, клиентская функция выполняется один раз, но сообщение об ошибке передается в обе сводки проверки: на страницу содержимого и на главную страницу. Я даже добавил третью сводку проверки и установил для ее группы что-то вроде «asdf», но о ней также сообщается, что означает, что все три сводки проверки показывают одну и ту же ошибку на странице.

Затем я создал отдельный тестовый проект ASP.NET, вставил в него весь код и запустил его, и он прошел проверку, как и должно быть.

Затем я поэкспериментировал с AutoEventWireup на странице содержимого. Когда я устанавливаю для него значение false, проверка работает, но событие загрузки страницы не срабатывает. Что случилось с этим?

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

Вопрос здесь: кто-нибудь знает, что может заставить один валидатор сообщать обо ВСЕХ сводках проверки на странице, даже если только один из них имеет ту же группу проверки, что и валидатор и кнопка?

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

<%@ Register Assembly="RadMenu.Net2" Namespace="Telerik.WebControls" TagPrefix="radM" %>

<radM:RadMenu ID="RadMenu1" runat="server" DataSourceID="smdsMenu" Skin="CssGrey" ClickToOpen="True" EnableViewState="False" CausesValidation="false" />

Таким образом, тот факт, что это работает в моем тестовом приложении, приводит меня к выводу, что мы делаем что-то в нашем рабочем приложении, чего я не делаю в своем тестовом приложении. Да, я знаю, что это расплывчато, но, возможно, в чьей-то голове взорвется лампочка.


person oscilatingcretin    schedule 20.05.2011    source источник


Ответы (3)


Чувак, после долгих часов крутки колес, я наконец понял это. Мы используем этот метод расширения, чтобы отключить двойные щелчки кнопок:

    public static void DisableDoubleClick(this Button Control)
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        sb.Append("if (typeof(Page_ClientValidate) == 'function') { ");
        sb.Append("if (Page_ClientValidate() == false) { return false; }} ");
        sb.Append("this.disabled = true;");
        sb.Append(Control.Page.ClientScript.GetPostBackEventReference(Control, ""));
        sb.Append(";");
        Control.Attributes.Add("onclick", sb.ToString());
    }

Это то, что мешало проверке, поскольку вызывало глобальную проверку. Я исправил это, внеся следующее изменение:

        sb.Append(string.Format("if (Page_ClientValidate({0}) == false) {{ return false; }}}} ",
            Control.ValidationGroup == string.Empty ? string.Empty : string.Format("\"{0}\"", Control.ValidationGroup)));

Что меня подсказало, так это то, что я установил для AutoEventWireup значение false, чтобы посмотреть, что произойдет. Это предотвратило запуск события загрузки страницы, из-за которого вызывался вышеуказанный метод расширения. Какая иголка в стоге сена, эта проблема.

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

изменить: благодаря slfan и gbs. Я только что понял проблему и возвращался сюда, чтобы опубликовать свой ответ, когда вижу, что вы двое, по сути, решали мою проблему с обеих сторон проблемы. Событие загрузки страницы — это место, где происходила привязка, а вызываемый метод расширения искажал функцию Page_ClientValidate. Поскольку вы оба технически правы, и я не могу дать вам обоим ответ, я надеюсь, что никто не расстроится, если я отмечу здесь свой собственный ответ. Вы двое определенно хороши в анализе таких проблем с минимальными подробностями и без примеров кода. Реквизит.

person oscilatingcretin    schedule 20.05.2011
comment
После пары часов разочарования, я понял, что мы делаем одно и то же. - person PhilChuang; 11.01.2013

AutoEventWireup заставляет ASP.NET автоматически вызывать событие Page_Load без необходимости регистрации в событии. Альтернативой может быть переопределение метода OnLoad. Ваша страница работает правильно, когда Page_Load не вызывается. Что вы делаете внутри этого метода? Какие-то странные привязки данных? А если раскомментировать этот код, он тогда будет работать? Таким образом, вы можете сузить свою проблему до реальной проблемы, которую вы не показываете в своем вопросе.

person slfan    schedule 20.05.2011

Две вещи, которые я бы искал:

1: Любая внешняя проверка с использованием Page_ClientValidate выполняется в javascript.

2: Любой явный вызов Page.Validate() в коде программной части

person gbs    schedule 20.05.2011