LoadControl和Page_Load事件未触发

时间:2009-10-01 16:51:11

标签: c# asp.net pageload loadcontrol

嘿所有人!我正在通过Web方法加载UserControl,并使用LoadControl功能:

// create page, stringWriter
Page _page = new Page();
StringWriter _writer = new StringWriter();

// get popup control
Controls_Popup_ForumThreadForm _control = _page.LoadControl("~/Controls/Popup_ForumThreadForm.ascx") as Controls_Popup_ForumThreadForm;

然后我执行以下操作:

// add control to page
 _page.Controls.Add(_control);

HttpContext.Current.Server.Execute(_page, _writer, false);

问题是控件的Page_Load事件根本不会触发。如果我添加另一个函数,并在将控件添加到页面的Controls集合之前调用它,则该函数将触发,但Page_Load事件不会触发。

任何想法,伙计?谢谢大家!

3 个答案:

答案 0 :(得分:4)

根据我的知识,在动态渲染控件时无法执行事件。但我在渲染用户控件方面有一个技巧。

我使用一个函数来呈现一个用户控件,该控件采用用户控制的物理路径和一个属性列表。我在用户控件中定义了一个特殊属性,它可以像一个方法,当我设置它时运行我的自定义代码。这是渲染函数:

public static string RenderUserControl(string path, List<KeyValuePair<string, object>> properties)
    {
        Page pageHolder = new Page();
        UserControl viewControl = (UserControl)pageHolder.LoadControl(path);
        viewControl.EnableViewState = false;
        Type viewControlType = viewControl.GetType();
        foreach (var pair in properties)
        {
            PropertyInfo property = viewControlType.GetProperty(pair.Key);
            if (property != null)
            {
                property.SetValue(viewControl, pair.Value, null);
            }
        }
        HtmlForm f = new HtmlForm();

        f.Controls.Add(viewControl);

        pageHolder.Controls.Add(f);
        StringWriter output = new StringWriter();
        HttpContext.Current.Server.Execute(pageHolder, output, false);
        return (output.ToString());
    }

在您需要呈现的用户控件中定义属性,例如RunMyCode 设置您想要的任何属性,最后添加您定义的特殊属性。

data.Add(new KeyValuePair<string, object>("RunMyCode", SomeDataOrNothing));

在用户控件的render事件中,您可以检查RunMyCode属性的值,如果已设置,则手动调用事件通常会引发的方法。

答案 1 :(得分:1)

检查ASP.NET Page Life Cycle Overview

PreInit:在开始阶段完成之后和初始化阶段开始之前引发。

将此事件用于以下事项:

Check the IsPostBack property to determine whether this is the first time the page is being processed. The IsCallback and IsCrossPagePostBack properties have also been set at this time.

Create or re-create dynamic controls.

Set a master page dynamically.

Set the Theme property dynamically.

Read or set profile property values.

答案 2 :(得分:0)

在页面生命周期的PreInit阶段添加控件:

var page = new Page();
var writer = new StringWriter();            
page.PreInit += new EventHandler((s, e) =>
{
    var control = page.LoadControl("");
    (Page)s).Controls.Add(control);
});
HttpContext.Current.Server.Execute(page, writer, false);