从Assembly和hook up事件加载服务器控件

时间:2011-07-04 07:55:44

标签: c# asp.net custom-server-controls

我有几个服务器控件,每个都在一个单独的程序集中,我想根据一些选择将其中一个动态加载到页面中。然而,似乎存在控件中的服务器端事件未触发的问题。

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;
    }

如何将加载的程序集注入页面,以便控件中的事件将被触发?这可能吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您在页面生命周期中添加控件的方式太晚了。在OnInit Page事件中添加服务器端控件是最好的选择。

查看this link以获取生命周期过程的概述。需要在回发事件处理发生时创建控件。 This series也非常好。

基于用户选择动态更改页面可能会因此而痛苦。有几种选择。最简单的方法是在OnInit中添加所有控件,然后在知道用户所做的选择时将其删除。

如果它真的是完全动态的,并且你不知道在处理回发之后你将要呈现什么控件,那么可以更容易地离开ASP.NET的viewstate / postback系统并自己检查。通过检查Form.Request集合,您始终可以在页面生命周期中随时获取所有发布值。