Событие не запускается достаточно рано в цикле .NET Page - PullRequest
0 голосов
/ 31 марта 2009

У меня есть страница (форма), на которой есть много пользовательских элементов управления, и я пытаюсь использовать одну кнопку, чтобы сохранить все. UserControls на самом деле являются вложенными, поэтому я хотел как-то сигнализировать каждому UC, что он должен сохранить себя, вместо того, чтобы каким-то образом обернуть все в одно событие или иметь одно событие, вызывающее каскад событий сохранения.

Мой план состоял в том, чтобы использовать статический класс (для кода этот ответ для кода):

public static class RequestScopedFormData
{
    private const string save_key = "request_form_is_saving";

    public static bool FormIsSaving
    {
        get
        {
            object o = HttpContext.Current.Items[save_key];
            return Convert.ToBoolean(o);
        }
        set
        {
            HttpContext.Current.Items[save_key] = value;
        }
    }
}

В идеале кнопка на моей MasterPage должна устанавливать RequestScopedFormData.FormIsSaving = true, и, когда .NET создает страницу и ее пользовательские элементы управления, они будут знать, как сохранить данные сами.

Проблема, с которой я столкнулся, заключается в том, что я не могу запустить событие достаточно рано в жизненном цикле страницы, чтобы сохранить пользовательские элементы управления. Даже если я переместил код сохранения в событие PreRender и переместил сохранение ImageButton на саму страницу (вместо MasterPage), мне не удастся установить для FormIsSaving значение true до проверки сохранения UC.

Это происходит примерно так:

  • Страница Page_Load
  • MasterPage Page_Load
  • UC Page_Loads и PreRenders (они смешиваются, это предваряет некоторые раньше загружает других)
  • Событие MasterPage SaveButton_Click (это где я установил свой класс переменный) * * тысяча двадцать-один
  • MasterPage PreRender
  • Страница PreRender

Так что, к сожалению, метод SaveButton_Click происходит после загрузки UC, поэтому они никогда не сохраняются.

Ответы [ 3 ]

3 голосов
/ 31 марта 2009

Измените вашу директиву @Page, чтобы включить Trace = "true" - это даст вам полную диагностику вызываемого и позволит вам определить лучший метод для той части жизненного цикла, которая вам нужна.

1 голос
/ 31 марта 2009

Вы также можете проверить, была ли обратная передача вызвана кнопкой сохранения:

Request.Form["__EVENTTARGET"].Contains({YourSaveButton}.UniqueID)

Переменные формы доступны ранее в жизненном цикле страницы.

0 голосов
/ 31 марта 2009

Все ваши элементы управления получены из одного интерфейса или вы можете добавить к ним общий интерфейс?

Затем в вашем методе кнопки сохранения вы можете перебрать все элементы управления на своей странице, а затем для элементов, соответствующих вашему интерфейсу, вызвать метод Save.

* 1005 Е.Г. *

foreach (Control cntrl in Page.Controls)
{
  if (cntrl is IMySavableControl)
  {
     cntrl.Save();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...