我有几个服务器控件,每个都在一个单独的程序集中,我想根据一些选择将其中一个动态加载到页面中。然而,似乎存在控件中的服务器端事件未触发的问题。
e.g。控件的形式如下:
[ToolboxData("<{0}:MyPlugin runat=server></{0}:MyPlugin>")]
public class MyPlugin : WebControl, PluginSystem.Interface.IMyPlugins
{
protected override void RenderContents(HtmlTextWriter output)
{
...
_btn = new Button();
_btn.ID = "btnSave";
this.Controls.Add(_btn);
_btn.Click += new EventHandler(btn_Click);
_btn.RenderControl(output);
}
void btn_Click(object sender, EventArgs e)
{
//do something. This doesn't fire
}
}
控件从其程序集加载:
public static IMyPlugins GetPlugin(string assembly, string type)
{
var t = Type.GetType(type + ", " + assembly);
IMyPlugins rtn = (IMyPlugins)Activator.CreateInstance(t);
rtn.Initialise();
return rtn;
}
如何将加载的程序集注入页面,以便控件中的事件将被触发?这可能吗?
感谢您的帮助!
答案 0 :(得分:0)
您在页面生命周期中添加控件的方式太晚了。在OnInit Page事件中添加服务器端控件是最好的选择。
查看this link以获取生命周期过程的概述。需要在回发事件处理发生时创建控件。 This series也非常好。
基于用户选择动态更改页面可能会因此而痛苦。有几种选择。最简单的方法是在OnInit中添加所有控件,然后在知道用户所做的选择时将其删除。
如果它真的是完全动态的,并且你不知道在处理回发之后你将要呈现什么控件,那么可以更容易地离开ASP.NET的viewstate / postback系统并自己检查。通过检查Form.Request集合,您始终可以在页面生命周期中随时获取所有发布值。