我正在尝试使用OnClick回调来调用C#函数,但是javascript会抛出一个错误,说该函数未定义(即使它在C#代码中)。
仅当我通过Controls.Add在C#call behind部分的page_load中添加控件时才会发生这种情况。
换句话说,如果我这样做(在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文件中,它运行正常并且通常调用C#函数。
答案 0 :(得分:8)
事件处理程序应附在服务器端:
LinkButton l = new LinkButton();
l.Text = "Test";
l.ID = "TestID";
l.Click += LinkButton_Click;
l.Page = Page;
this.Controls.Add(l);
当您使用Attributes
属性时,您实际上附加了一个不存在的客户端功能。
答案 1 :(得分:2)
问题在于,当您通过标记定义LinkButton时,OnClick属性将被解释为服务器端控件的一部分。
当您通过代码隐藏添加OnClick属性时,您将定义客户端属性(服务器根本不会对其进行处理)。
如果您确实想通过代码隐藏定义此事件处理程序,则需要删除以下行:
l.Attributes.Add("OnClick", "LinkButton_Click");
并将其替换为:
l.Click += LinkButton_Click;
答案 2 :(得分:1)
Attribute.Add发送到HTML,而不是aspx,所以你告诉它应该有一个名为LinkButton_Click()的javascript函数来处理点击事件。
要将事件附加到c#对象,以下是正确的语法:
LinkButton l = new LinkButton();
l.Text = "Test";
l.ID = "TestID";
l.Click += LinkButton_Click; // <-- this row attaches the event
this.Controls.Add(l);
答案 3 :(得分:1)
您添加它的方式是将属性添加到html。您需要做的是添加一个事件处理程序 l。点击+ = new EventHandler ...
答案 4 :(得分:1)
您需要将事件处理程序添加到l.Click,而不是在属性中。