通过XML+XSLT生成的Telerik上传控件OnFileUploaded事件不触发如何解决?
动态加载RadAsyncUpload事件不触发的解决方案
核心原因
- 通过
ParseControl解析字符串生成的控件,ASP.NET不会自动将标记中OnFileUploaded属性关联到后台的事件处理方法,只有静态声明在页面的控件才会在编译阶段完成自动绑定。 - PreInit阶段母版页的ContentPlaceHolder还未完成初始化,此时往内容容器中添加的控件无法正确挂载到页面控件树,错过后续的事件路由流程。
解决步骤
- 调整控件加载时机到Page_Init阶段
这个阶段母版页的内容占位符已经初始化完成,动态添加的控件可以正确加入控件树,赶上视图状态加载、事件路由的生命周期节点。 - 手动绑定服务端事件
解析完XSLT输出的控件后,手动查找RadAsyncUpload控件并绑定事件,示例代码如下:
// 原有逻辑生成控件 Control parsedControl = master.ParseControl(ApplyXslt(xml, xsl_trans, xsl_args)); // 手动查找上传控件并绑定事件 var asyncUpload = parsedControl.FindControl("AsyncUpload1") as RadAsyncUpload; if (asyncUpload != null) { asyncUpload.FileUploaded += AsyncUpload1_FileUploaded; } // 再添加到容器 tContent.Controls.Add(parsedControl);
- 保证每次回发都重新添加动态控件
不要把加载动态控件的逻辑包裹在if(!IsPostBack)判断里,ASP.NET的控件树每次回发都会重建,必须每次回发都重新生成并添加动态控件,事件才能找到对应的触发目标。 - 保持控件ID固定
确保XSLT每次生成的RadAsyncUpload控件ID都是固定的AsyncUpload1,不要动态生成随机ID,ASP.NET依靠控件ID匹配路由回发事件。
内容的提问来源于stack exchange,提问作者Jack Thor
相关产品推荐
相关产品推荐

