Управление пользовательскими кнопками ASP.NET - как переопределить OnClientClick, но сохранить существующее поведение? - PullRequest
5 голосов
/ 20 августа 2010

Итак, у меня есть пользовательский элемент управления ASP.NET 4 под названием «SafeClickButton», который предназначен для переопределения поведения по умолчанию клика на стороне клиента (OnClientClick).

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

Похоже, что он правильно отображает HTML (onclick = "this.disabled = true; __ doPostback ...) и отключаетправильно, но проблема с проверкой страницы. Если какая-либо проверка на странице не удалась, ее отправка обратно и ТО показывает ошибки проверки (где это должно быть сделано на стороне клиента без необходимости обратной передачи).

Вот код для пользовательского элемента управления.

public class SafeClickButton : Button
    {
        public override string OnClientClick
        {
            get
            {
                return string.Format("this.disabled=true;{0}", Page.ClientScript.GetPostBackEventReference(this, string.Empty));
            }
            set
            {
                base.OnClientClick = value;
            }
        }

        protected override PostBackOptions GetPostBackOptions()
        {
            PostBackOptions options = new PostBackOptions(this, string.Empty) {ClientSubmit = true};
            if (Page != null)
            {
                if (CausesValidation && (Page.GetValidators(ValidationGroup).Count > 0))
                {
                    options.PerformValidation = true;
                    options.ValidationGroup = ValidationGroup;
                }
                if (!string.IsNullOrEmpty(PostBackUrl))
                {
                    options.ActionUrl = HttpUtility.UrlPathEncode(ResolveClientUrl(PostBackUrl));
                }
            }
            return options;  
        }
    }

Что я делаю не так?

РЕДАКТИРОВАТЬ

Хорошо, поэтому я нашел часть проблемы:

return string.Format("this.disabled=true;{0}", Page.ClientScript.GetPostBackEventReference(this, string.Empty));

Не будет применять дервидное поведение postbackoptions.

Поэтому я изменил его на следующее:

return string.Format("this.disabled=true;{0}", Page.ClientScript.GetPostBackEventReference(GetPostBackOptions()));

Теперь проверка запускается правильнона стороне клиента, но кнопка не включена повторно, FML =)

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

Есть идеи?

1 Ответ

3 голосов
/ 20 августа 2010

Вы можете просто добавить метод Page_ClientValidate в строку.Я никогда не пробовал это, так что это может не сработать:

return string.Format("if (Page_ClientValidate()) { this.disabled=true; {0} } else return false;",
   Page.ClientScript.GetPostBackEventReference(this, string.Empty));

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

РЕДАКТИРОВАТЬ: Я обновил ответ и переместил вас отключить в if, поэтому он отключается только при сбое Page_ClientValidate.

Проверьте эту ссылку, так как вы делаете то, что выищу я думаю и иллюстрирую что я имел ввиду с Page_ClientValidate:

http://msmvps.com/blogs/anguslogan/archive/2004/12/22/27223.aspx

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