ASP:runat =服务器用于动态控制

时间:2012-07-05 02:43:40

标签: asp.net runatserver

在Page_Load方法中,我根据各种条件创建了几个控件。我想用这些控件注册服务器端代码。但是,对于最后一部分,我需要将控件声明为服务器控件。这通常由runat = server完成,但我不知道如何在C#代码中设置此属性。 myControl.Attributes.Add(“runat”,“server”)不起作用。这个工作,这意味着当我点击它时调用“test”方法:

<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");

我可以点击它,然后加载页面,但不调用测试方法。

任何提示?

4 个答案:

答案 0 :(得分:3)

你几乎做对了。只是几件事:

  • 手动实例化服务器控件时,无需添加runat="server"属性。这是一个特殊属性,仅供ASP.NET页面解析器用于区分服务器控件和其他标记。
  • 标记中的OnClick属性对应于Click服务器端事件,您使用+=运算符挂接该事件。 (另一方面,标记中的OnClientClick属性对应于onclick 客户端属性,该属性通常包含一段JavaScript代码。{{1与OnClick不对应,无疑是有点令人困惑。)

因此:

onclick

你的事件处理程序(如果没有从标记中引用它,你甚至可以使LinkButton lb = new LinkButton(); lb.ID = "LinkButton1"; lb.Click += test; lb.Text = "testtext"; ):

private

答案 1 :(得分:2)

您是否尝试注册服务器端事件?如果是这样,你可以这样做。

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

事件

protected void LinkButton1_Click(object sender, EventArgs e)
{ 

}

答案 2 :(得分:0)

你不需要。由于控件是通过C#代码在服务器端创建的,因此它们已经是服务器端控件。您遇到的问题与页面生命周期有关:当您在服务器端创建控件时,您需要在每次回发时重新添加控件并重新挂接您要处理的任何事件处理程序对他们来说。

另请注意,您的代码显示了两个不同的东西:在您发布的标记上,您正在显示OnClick事件的处理程序,而在C#代码中,您正在为OnClientClick添加处理程序事件。它们是两个不同的东西。 OnClientClick事件只会在单击控件时触发您页面上的所有JavaScript代码。这与完成此操作完全相同:

 link.Attributes.Add("onclick","SomeJavascriptFunction();");

答案 3 :(得分:0)

首先,您不需要lb.Attributes.Add("runat", "server")行。所有runat="server"都会使控件对代码隐藏可见。由于您在代码隐藏中添加了控件,这是一个有争议的问题。

对于脚本,请注意有效的脚本使用的是OnClick,而您使用的OnClientClick正在使用OnClick。差异很重要,因为test通过javascript本身可以理解,它会找到名为OnClientClick的函数并执行它。

另一方面,

test是ASP.NET运行时手动绑定到click事件的任意javascript。意思是,它只是执行test()。没什么。另一方面,lb.OnClickClick = "test()";是正确的javascript。

因此,将该行更改为{{1}}

编辑:我把自己搞砸了,看到另一个答案。