ASP.NET Запуск серверных событий с несколькими аргументами - PullRequest
0 голосов
/ 06 августа 2009

Боюсь, у меня довольно длинный вопрос. Я довольно новичок в ASP.NET, поэтому, пожалуйста, потерпите меня. Я создал элемент управления для страницы ASP.NET, в которой перечислен ряд параметров. У каждой опции есть две интерактивные области (для простоты назовите их кнопками). Один для выбора опции и один для скрытия опции.


protected void Page_Load(object sender, EventArgs e)
{
  RenderOptions();
}

public void RenderOptions()
{
  for (int i = 0; i < 5; i++) {
    HtmlGenericControl div1 = new HtmlGenericControl("div");
    div1.Attributes.Add("onclick", ClientScript.GetPostBackEventReference(this, "option" + i));
    m_TreeContainer.Controls.Add(div1);

    HtmlGenericControl div2 = new HtmlGenericControl("div");
    div2.Attributes.Add("onclick", ClientScript.GetPostBackEventReference(this, "option" + i));
    m_TreeContainer.Controls.Add(div2);
  }
}

public void RaisePostBackEvent(string arg) 
{
  //do something
}

Это прекрасно работает (я реализую интерфейс IPostBackEventHandler). Проблема здесь в том, что мне кажется, что нет способа узнать, какой элемент HTML был нажат и, следовательно, какое действие должно быть выполнено в методе RaisePostBackEvent.

Я пытался создать новый класс (HtmlDivControl), который выглядит следующим образом:


class HtmlDivControl : HtmlGenericControl, IPostBackEventHandler
{
  #region Delegates
  public delegate void ClickEventHandler(object sender, string eventArgument);
  #endregion

  #region Properties
  private ClickEventHandler m_Click;
  public ClickEventHandler Click
  {
    get { return m_Click; }
    set { m_Click = value; }
  }
  #endregion

  #region Constructors
  public HtmlDivControl()
  {
  }
  #endregion

  public void RaisePostBackEvent(string eventArgument)
  {
    m_Click.Invoke(this, eventArgument);
  }
}

Теперь я сделал div1 и div2 своим HtmlDivControl, а не HtmlGenericControl, установил свойство Click для метода (делегата) и передал сам div (div1 или div2) в качестве элемента управления для метода GetPostBackEventReference. На этот раз я мог не только различать div, но и заранее определить действие, которое должно быть выполнено. Однако RaisePostBackEvent для элементов управления вызывается после PageLoad. Поэтому проблема, с которой я сейчас сталкиваюсь, заключается в том, что весь элемент управления опциями отображается перед обработкой событий (и, таким образом, параметр, который, например, должен быть скрыт, не потому, что фактическое скрытие происходит после рендеринга). Перемещение вызова RenderOptions () в метод PageLoadComplete также не помогает, поскольку тогда элементы управления div еще не существуют.

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

p.s. Как я должен писать подчеркивания здесь? Они используются, чтобы сделать текст курсивом? Есть какой-нибудь экранирующий персонаж?

1 Ответ

2 голосов
/ 06 августа 2009

Для кого-то новичка в ASP.Net вы уже неплохо справились. Ваш контрольно-пропускной пункт здесь на самом деле, как вы думаете о проблеме. Вы должны хорошо понять жизненный цикл страницы ASP.Net - вам не хватает чего-то очень фундаментального.

Короче говоря, вы хотите, чтобы ваша страница восстановила свое состояние так же, как это было до обратной передачи. Затем обработайте ваши события. Затем внесите любые изменения состояния.

Вы думаете об этом, как будто ваши HTML-элементы управления должны знать об изменении их состояния в начале запроса, что неверно. Сначала должна быть фаза восстановления. Это важно для ASP.Net, чтобы даже выяснить, какие события поднять.

Что я бы порекомендовал:

  1. переместите ваш метод RenderOptions () в обработчик Page_Init. Это избавит вас от многих проблем, если вы когда-нибудь включите ViewState в свои элементы управления. (Я бы также переименовал его, поскольку он ничего не отображает, а просто добавляет элементы управления на страницу. У Render есть определенный контекст в ASP.Net).

  2. Затем в обработчиках событий OnClick для ваших элементов управления просто установите видимость элементов управления по мере необходимости, а не пытайтесь контролировать способ их визуализации. Всегда намного проще установить элементы управления на Visible = False, чем пытаться изменить способ отображения элементов управления на странице. Помните, что если вы установите Visible = False, в ответ на этот элемент управления будет отправлено ноль html, но сервер все равно будет знать, что он находится на странице, поэтому вы все равно можете с ним справиться.

Думайте о ваших обработчиках событий как о месте, где вы будете изменять состояние страницы. Именно в этом случае должна быть ваша логика, а не в Page_Load.

...