动态加载控件 - 如何访问Page_Init中的值

时间:2009-03-29 15:21:21

标签: asp.net events controls

当用户点击另一个LinkBut​​ton时,我正在动态加载LinkBut​​ton。我正在附加一个事件处理程序。当用户单击动态加载的LinkBut​​ton时,事件不会触发。

从我读过的内容来看,我理解这是因为当页面回发时动态加载的控件不再存在。看起来我应该确保在Page_Init中重新创建此控件。

动态创建的LinkBut​​ton取决于值(产品ID)。我需要一些访问此值,以便我可以正确创建控件。 ViewState不可访问,我担心如果我使用Session它可能会超时,然后这无济于事。有什么想法吗?

此外,我仅仅为了测试而对产品ID值进行了硬编码,但仍然没有导致事件触发。还有什么我需要做的吗?

protected void Page_Init(object sender, EventArgs e)
{
   SetTabText(1, 1);
}

SetTabText调用创建LinkBut​​ton的SetActionLinks:

protected Panel SetActionLinks(int prodID, int tabID) {
...
LinkButton lnkBtn = new LinkButton();
lnkBtn.ID = "lnkBtn" + rand.Next().ToString();
lnkBtn.CommandName = "action";
lnkBtn.Command += new CommandEventHandler(this.lnkAction_Command);
panel.Controls.Add(lnkBtn);
...
}
void lnkAction_Command(object sender, CommandEventArgs e)
{
   LinkButton btn = (LinkButton)sender;
   switch (btn.CommandArgument)
   {
      AddCart();
   }
}

6 个答案:

答案 0 :(得分:6)

您可以将产品ID放在隐藏字段中,并使用

在Page_Init中获取其值
Page.Request(Page.FindControl("hdnPageIdField"))

这样您就不需要依赖ViewState或SessionState

另外,对于动态控件,我强烈建议您阅读this greate arcticle series

答案 1 :(得分:2)

在您的方案中,我尝试了您的代码,下面的行会导致您的事件触发错误:

lnkBtn.ID = "lnkBtn" + rand.Next().ToString();

尝试设置不在回发之间更改的ID。

对于ViewState,您可以将代码移至Page_Load。您的代码工作原理相同,但您可以访问ViewState和Control的发布值

答案 2 :(得分:1)

几个月前,我花了一个不眠之夜搞清楚这样的事情。那时我完全理解了ASP.NET建立在无状态基础上的事实,它通过在客户端和服务器之间来回ping-view来保持状态。

如果要动态添加和删除控件或修改现有控件以响应动态创建的控件的事件触发,则父元素的PageInit需要在事件触发时存在的状态下重新创建子控件(之前应用事件的动作)。它似乎是多余的,但是为了确保接收器存在并且当服务器想要触发事件时可以调用它的处理程序是必要的。然后控件的事件处理程序将能够应用更改(并添加或删除控件,分配不同的ID等)。

我发现ASP.NET事件生命周期(http://msdn.microsoft.com/en-us/library/ms178472.aspx)上的这个页面很有帮助。

答案 3 :(得分:1)

这适用于Page_Init

HiddenField ctrl = (HiddenField)Page.FindControl("hfTest");
string strValue = Page.Request.Form.Get(ctrl.ClientID);

HiddenField将存储要加载的控件(Pipe Delimited),我们可以动态加载控件。

答案 4 :(得分:0)

查看匿名代表

LinkButton lb = new LinkButton();
lb.Command += delegate { // do something here. also you can access any variable from current stack };

答案 5 :(得分:0)

你的.aspx文件中有AutoEventWireup="true"吗?