C# 自定义控件中的LinkButton未呈现ID(或根本无法正常工作)

C# 自定义控件中的LinkButton未呈现ID(或根本无法正常工作),c#,asp.net,linkbutton,C#,Asp.net,Linkbutton,我猜这可能与此有关,但不幸的是,在这种情况下,解决方法似乎不起作用 在挣扎于更大的实现不起作用之后,我将其归结为最简单的情况。这是行不通的 public class MyButton : Control { public MyButton() : base() { LinkButton but = new LinkButton(); but.CommandName = "test

我猜这可能与此有关,但不幸的是,在这种情况下,解决方法似乎不起作用

在挣扎于更大的实现不起作用之后,我将其归结为最简单的情况。这是行不通的

   public class MyButton : Control
    {
        public MyButton()
            : base()
        {
            LinkButton but = new LinkButton();
            but.CommandName = "test";
            but.CommandArgument = "test2";
            but.Text = "Click Here";
            Controls.Add(but);
        }
    }
呈现的是:

<a href="javascript:__doPostBack('ctl00$ctl11$ctl07','')">Click Here</a>

这里有两个主要问题。首先,没有ID。它应该有标签
ID='ctl00$ctl11$ctl07'
。因此,即使它会发布,事件也不会被捕获

其次,它忽略了CommandName和CommandArgument,无论如何它都应该使用options呈现
\uu dopostback

我是非常愚蠢,只是忽略了一些显而易见的东西,还是这是ASP.NET中的一个巨大错误

我以前做过很多次,在
控件
网络控件
中呈现了许多其他控件,但从来没有遇到过任何问题,因此我想这一定与简单性有关,而不是复杂性


如果有人能帮我解决这个问题,我们将不胜感激。

这是因为您应该实现设置按钮的ID属性

but.ID = "MyLinkButtonID";
 but.Command += new CommandEventHandler(EVENTHANDLER);
如果按钮始终是类的成员,则将按钮添加为成员,并将其添加到OnInit事件中的控件集合中


忘记为命令事件添加事件处理程序。

ARGH!我踢自己,答案实际上是命名容器的问题。这是其中一种情况,我所能做的就是关注一些细节,而这实际上并不是问题所在

我的自定义控件由另一个控件发出。。。进入第三个控制。但是“第三个控件”可能有几个实例。(大的方面是,我正在制作一些东西,它允许我在窗体前后放置窗体控件按钮的副本。主控件决定为给定窗体发出哪些按钮。)


所以“第三个控件”不是命名容器。这简直是扼杀了它。但是我从来没有在ID冲突方面遇到任何错误,它就是不起作用。

没有什么区别。也不应该。InAdminContainer只需确保容器中用户分配ID的唯一性。这不是一个转发器,也没有分配任何自己的ID。让我重新表述一下:它确实有区别,ID位于我用于控件的ID的上下文中,而不是页面的上下文中。但它仍然不起作用,它不呈现自己的ID,也不呈现正确的回发javascript。我已经试过了(在大约一百万件其他事情中):)我的错。实际上,我认为您应该继承LinkButton
公共类MyButton:LinkButton
或从
CompositeControl
继承此控件,并重写
CreateChildControls
方法,在该方法中设置LinkButton.idieah--我只是忘了在这个简单的例子中放置命令事件处理程序。虽然没有必要指定一个ID,但我想我一直在关注它为回发呈现的javascript,我意识到对于链接按钮并不总是“带选项”。我开始认为我的问题是我(最初)使用了WebControl,但覆盖了渲染,没有发出包装器。在没有命名容器的情况下,这会使它无法工作,因为它是在外部ID的上下文中工作的。无论如何——这个例子确实有效,所以显然我是非常愚蠢的。