求救啊!UpdatePanel找不到设置的trigger

下楼弹吉他 2010-04-02 09:24:07
aspx页面动态load用户控件,用户控件中包含UpdatePanel,第一次加载的时候没问题,点击btnTest按钮回发后就报下面的错误。

异常信息:


捕捉到 System.InvalidOperationException
Message="A control with ID 'btnTest' could not be found for the trigger in UpdatePanel 'up1'."
Source="System.Web.Extensions"
StackTrace:
在 System.Web.UI.UpdatePanelControlTrigger.FindTargetControl(Boolean searchNamingContainers)
在 System.Web.UI.AsyncPostBackTrigger.Initialize()
在 System.Web.UI.UpdatePanelTriggerCollection.Initialize()
在 System.Web.UI.UpdatePanel.Initialize()
在 System.Web.UI.PageRequestManager.RegisterUpdatePanel(UpdatePanel updatePanel)
在 System.Web.UI.ScriptManager.System.Web.UI.IScriptManagerInternal.RegisterUpdatePanel(UpdatePanel updatePanel)
在 System.Web.UI.UpdatePanel.RegisterPanel()
在 System.Web.UI.UpdatePanel.OnInit(EventArgs e)
在 System.Web.UI.Control.InitRecursive(Control namingContainer)
在 System.Web.UI.Control.InitRecursive(Control namingContainer)
在 System.Web.UI.Control.AddedControl(Control control, Int32 index)
在 System.Web.UI.ControlCollection.Add(Control child)
在 FrmTestTriggers.Page_Load(Object sender, EventArgs e)

代码 母页面

<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:Label ID="lblContain" runat="server"></asp:Label>
</form>
</body>
</html>

cs 文件

protected void Page_Load(object sender, EventArgs e)
{

WucTestTriggers wc = this.LoadControl("WucTestTriggers.ascx") as WucTestTriggers;
wc.ID = "idTest";
this.lblContain.Controls.Add(wc);
}

子用户控件

<asp:UpdatePanel ID="up1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="False">
<ContentTemplate>
<asp:DataGrid ID="dgList" runat="server" AutoGenerateColumns="true">
</asp:DataGrid>
<asp:TextBox ID="txtTest" runat=server Text="bu"></asp:TextBox>

</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnTest" EventName="Click"></asp:AsyncPostBackTrigger>
</Triggers>
</asp:UpdatePanel>
<asp:Button ID="btnTest" runat="server" Text="触发" OnClick="btnTest_Click" />


上面的红色部分放到<ContentTemplate>里面就报错了啊。<asp:UpdatePanel ID="up1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="False">
<ContentTemplate>
<asp:DataGrid ID="dgList" runat="server" AutoGenerateColumns="true">
</asp:DataGrid>
<asp:TextBox ID="txtTest" runat=server Text="bu"></asp:TextBox>
<asp:Button ID="btnTest" runat="server" Text="触发" OnClick="btnTest_Click" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnTest" EventName="Click"></asp:AsyncPostBackTrigger>
</Triggers>
</asp:UpdatePanel>
感觉像是生命周期的影响,搞不清楚具体根源,求救啊。
...全文
731 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
缪军 2010-04-02
  • 打赏
  • 举报
回复
我不确定7楼的回复能不能解决楼主的问题,因为我的情况和楼主不完全一样,
我的代码是动态加载控件(不是ascx),
我连同控件和触发器都是在page init 里动态加载的

StyleControl.ButtonPlus _btnExport = new StyleControl.ButtonPlus();
_btnExport.Text = "导出Excel";
_btnExport.ID = "btnExport";
_btnExport.Attributes["style"] = "float:right;";
_btnExport.UseSubmitBehavior = false;
_btnExport.Click += new EventHandler(btnExport_Click);
this.L13_1_1.Controls.Add(_btnExport);

PostBackTrigger _tg = new PostBackTrigger();
_tg.ControlID = _btnExport.ID;
this.UpdatePanel1.Triggers.Add(_tg);
缪军 2010-04-02
  • 打赏
  • 举报
回复
还有前面几位,UpdateMode="Conditional" ChildrenAsTriggers="False"是异步提交的固定用法,
这个微软有明确说明的,希望各位回答问题不要想当然的,这样不但帮不了提问者,还会添乱耽误时间,
混技术分真的那么重要么?难道认真回答别人的问题不也是同样提高自己吗?
缪军 2010-04-02
  • 打赏
  • 举报
回复
后面的代码没错,错在前面,你是动态添加的,你要确认两点:
1、客户端实际的clientID还和你代码里的ID一样吗?如果当然你定义的触发器无法找到那个按钮;
2、在Page_Load加载的控件能持久吗?页面刷新后是不是就没有了?
是不是可以尝试在protected override void OnInit(EventArgs e){}这个事件中加载
init加载可以产生持久的效果

下楼弹吉他 2010-04-02
  • 打赏
  • 举报
回复
把ChildrenAsTriggers设为"False",又把btnTest设为异步触发可能有冲突,但是具体机制是什么啊,有人知道吗?
下楼弹吉他 2010-04-02
  • 打赏
  • 举报
回复
但是为什么trigger控件位置放的不同会报错了,A control with ID 'btnTest' could not be found for the trigger in UpdatePanel 'up1'
zhongxiangyun 2010-04-02
  • 打赏
  • 举报
回复
不会,在Asp.Net中,UpdatePanel是更新面板,页面中哪些地方想实现无刷新技术,您就把控件放进UpdatePanel当中就行了。至于Trigger你可以自己写代码实现触发事件,也可以在属性中进行设置。其实,很简单的,自己在做项目,托控件的时候,要特别认真,仔细,谨慎,就行了。
下楼弹吉他 2010-04-02
  • 打赏
  • 举报
回复
我就是不想让UpdatePanel里面的控件都触发异步回发(程序中包含了太多的控件),设置了ChildrenAsTriggers="False",用trigger去触发,现在奇怪的是我吧trigger控件放在UpdatePanel外面是没有问题的,放到<ContentTemplate>里面就报错了,想知道根源啊。
wwx6312388 2010-04-02
  • 打赏
  • 举报
回复
<asp:UpdatePanel ID="up1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="False">

估计是ChildrenAsTriggers="False"出错,应当设置为true
wwx6312388 2010-04-02
  • 打赏
  • 举报
回复
<asp:UpdatePanel ID="up1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="False">

估计是ChildrenAsTriggers="False"这个出错,应当设置为true
缪军 2010-04-02
  • 打赏
  • 举报
回复
更正11楼:loadviewstate
缪军 2010-04-02
  • 打赏
  • 举报
回复
page的加载过程:
init -> loadcontrolstate -> loadviewstate -> loadpostdata -> onload
-> prerender -> saveviewstate ->savecontrolstate ->render
缪军 2010-04-02
  • 打赏
  • 举报
回复
你可以搜一下asp.net的页面生命周期的相关文章看一下,
简单的说,由于init实在saveviewstate之前发生的,所以你加载的内容被保存到视图里了
下楼弹吉他 2010-04-02
  • 打赏
  • 举报
回复
非常感谢啊,我放到OnInit事件里面确实是可以了,但是对”上面init加载可以产生持久的效果“不是很明白,实际上每次Postback的时候OnInit事件都要执行的啊这是和page_load一样的啊。

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧