ASP: runat = сервер для динамического управления

В методе Page_Load я создаю несколько элементов управления в зависимости от различных условий. Я хотел бы зарегистрировать код на стороне сервера с этими элементами управления. Однако в последней части мне нужно объявить свои элементы управления как серверные элементы управления. Обычно это делается с помощью runat = server, но я не знаю, как установить этот атрибут в коде C #. myControl.Attributes.Add ("runat", "server") не помогает. Этот работает, это означает, что когда я нажимаю на него, вызывается "тестовый" метод:

<asp:LinkButton ID="LinkButton1" runat="server" OnClick="test">testtext</asp:LinkButton>

Это не работает:

            LinkButton lb = new LinkButton();
            lb.ID = "LinkButton1";
            lb.OnClientClick = "test";
            lb.Text = "testtext";
            lb.Attributes.Add("runat", "server");

Я могу щелкнуть по нему, и страница загружается, но тест-метод не вызывается.

Какие-нибудь намеки?


person Jan    schedule 05.07.2012    source источник


Ответы (4)


Вы почти правильно поняли. Всего пара вещей:

  • При создании экземпляра серверного элемента управления вручную нет необходимости добавлять атрибут runat="server". Это специальный атрибут, который используется только анализатором страницы ASP.NET, чтобы отличать серверные элементы управления от другой разметки.
  • Атрибут OnClick в разметке соответствует событию на стороне сервера Click, которое вы подключаете с помощью оператора +=. (С другой стороны, атрибут OnClientClick в разметке соответствует атрибуту onclick на стороне клиента, который обычно содержит фрагмент кода JavaScript. Тот факт, что OnClick не соответствует onclick, по общему признанию, немного сбивает с толку.)

Таким образом:

LinkButton lb = new LinkButton();
lb.ID = "LinkButton1";
lb.Click += test;
lb.Text = "testtext";

И ваш обработчик событий (который вы даже можете сделать private, если на него нет ссылок из разметки):

protected void test(object sender, EventArgs e)
{
}
person Michael Liu    schedule 05.07.2012
comment
Да спасибо. Это работает. Теперь, если я добавлю обычную кнопку (‹asp: Button runat = server ID = submit Text = query /›), щелчок по моей предыдущей кнопке ссылки ничего не вызовет (загрузка страницы отсутствует). Если кнопки asp: нет на странице, все работает как шарм. Какие-нибудь подсказки? - person Jan; 05.07.2012
comment
Когда вы говорите, что LinkButton ничего не запускает, вы имеете в виду, что страница все еще обновляется (но обработчик событий LinkButton не вызывается), или страница не обновляется вообще? Кроме того, каким методом вы добавляете LinkButton на страницу? - person Michael Liu; 05.07.2012
comment
Я добавляю LinkButton в Page_Load. Кнопка asp: находится в файле .aspx. И да, страница вообще не обновляется. Как только убираю кнопку asp: все работает как раньше. - person Jan; 09.07.2012
comment
Это, конечно, очень странно. Если страница даже не отправляется обратно, когда вы нажимаете LinkButton, то единственные причины, о которых я могу думать, это (1) ошибка проверки формы и (2) ошибка JavaScript. - person Michael Liu; 09.07.2012
comment
Вы также можете попробовать добавить lb в свой серверный элемент управления: this.Controls.Add (lb); Я должен был сделать это, чтобы мои события сработали. Кроме того, я не профессионал, когда дело касается жизненного цикла страницы, но я обычно объявляю свои динамические элементы управления в конструкторе. Таким образом, я знаю, что они существуют, когда страница начинает вызывать события кликов. - person David Peterson; 22.03.2013

Вы пытаетесь зарегистрировать событие на стороне сервера? Если да, вы можете это сделать.

LinkButton lb = new LinkButton();
lb.ID = "LinkButton1";
lb.Click += new EventHandler(LinkButton1_Click);
lb.Text = "testtext";

Событие

protected void LinkButton1_Click(object sender, EventArgs e)
{ 

}
person Helen    schedule 05.07.2012

Тебе это не нужно. Поскольку элементы управления создаются на стороне сервера с помощью кода C #, они уже являются элементами управления на стороне сервера. Проблема, с которой вы столкнулись, связана с жизненным циклом страницы: когда вы создаете элемент управления на стороне сервера, как вы это делаете сейчас, вам нужно повторно добавлять элемент управления при каждой обратной передаче и повторно перехватывать любые обработчики событий, которые вы хотите обработать. для них.

Также обратите внимание, что ваш код показывает две разные вещи: в разметке, которую вы опубликовали, вы отображаете обработчик для события OnClick, тогда как в коде C # вы добавляете обработчик для события OnClientClick. Это 2 разные вещи. Событие OnClientClick просто запускает любой код javascript, который есть на вашей странице, при нажатии на элемент управления. Это точно так же, как и вот так:

 link.Attributes.Add("onclick","SomeJavascriptFunction();");
person Icarus    schedule 05.07.2012

Во-первых, вам не нужна эта lb.Attributes.Add("runat", "server") строка. Все, что делает runat="server", - это делает элемент управления видимым для кода программной части. Поскольку вы добавляете элемент управления в код программной части, это спорный вопрос.

Что касается сценария, обратите внимание, что тот, который работает, использует OnClick, а ваш сломанный - OnClientClick. Разница важна, потому что OnClick изначально понимается javascript, и он найдет функцию с именем test и выполнит ее.

OnClientClick, с другой стороны, представляет собой произвольный javascript, который среда выполнения ASP.NET связывает с событием щелчка вручную. Это означает, что он просто выполнит test. Ничего подобного. test(), с другой стороны, является правильным javascript.

Итак, измените эту строку на lb.OnClickClick = "test()";

edit: Я перепутал себя, см. другой ответ.

person bhamlin    schedule 05.07.2012