2010-10-27 4 views
0

Я пытаюсь использовать обратный вызов OnClick для вызова функции C#, однако javascript выдает ошибку, говоря, что функция не определена (хотя она и есть в коде C#).Обратный вызов OnClick считает, что это функция javascript?

Это происходит только в том случае, если я добавляю элемент управления через Controls.Add в page_load вызова C# позади.

Другими словами, если я это делать (в функции Page_Load):

 LinkButton l = new LinkButton(); 
     l.Text = "Test"; 
     l.ID = "TestID"; 
     l.Attributes.Add("OnClick", "LinkButton_Click"); 
     l.Attributes.Add("runat", "server"); 
     l.Page = Page; 
     this.Controls.Add(l); 

LinkButton_Click не определяется в соответствии с JavaScript, однако, если я это сделать:

В ASCX файл работает нормально, а ctually вызывает функцию C#.

+0

У вас есть фрагмент кода отсутствует? –

+1

Хмм ... У меня плохой запах кода здесь. почему бы вам просто не использовать обработчик событий LinkButton.Click, так как вы устанавливаете его в коде? –

ответ

8

обработчики событий должны быть прикреплены на стороне сервера:

LinkButton l = new LinkButton(); 
l.Text = "Test"; 
l.ID = "TestID"; 
l.Click += LinkButton_Click; 
l.Page = Page; 
this.Controls.Add(l); 

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

1

Attribute.Add испускает HTML, а не aspx, поэтому вы говорите ему, что для обработки события click click должна быть функция javascript, называемая LinkButton_Click().

Чтобы прикрепить событие в C# объекта, следующий правильный синтаксис:

LinkButton l = new LinkButton(); 
l.Text = "Test"; 
l.ID = "TestID"; 
l.Click += LinkButton_Click; // <-- this row attaches the event 
this.Controls.Add(l); 
2

Проблема заключается в том, что при определении LinkButton через разметку атрибут OnClick интерпретируется как часть управления на стороне сервера.

Когда вы добавляете атрибут OnClick через код, вы определяете атрибуты на стороне клиента (которые вообще не обрабатываются сервером).

Если вы действительно хотите, чтобы определить этот обработчик событий с помощью кода позади, вам необходимо удалить следующую строку:

l.Attributes.Add("OnClick", "LinkButton_Click"); 

И заменить его:

l.Click += LinkButton_Click; 
1

То, как вы добавив, что добавляет атрибут в html. Что вам нужно сделать, это добавить обработчик событий l.Click + = new EventHandler ...

1

Вам нужно добавить обработчик события в l.Click, а не в атрибуты.