LoadControl和Page_Load事件未触发

Ste*_*ams 9 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;
Run Code Online (Sandbox Code Playgroud)

然后我做以下事情:

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

HttpContext.Current.Server.Execute(_page, _writer, false);
Run Code Online (Sandbox Code Playgroud)

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

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

Mah*_*hdi 5

据我所知,动态渲染控件时不可能执行事件。但我有一个技巧可以渲染有效的用户控件。

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

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());
    }
Run Code Online (Sandbox Code Playgroud)

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

data.Add(new KeyValuePair<string, object>("RunMyCode", SomeDataOrNothing));
Run Code Online (Sandbox Code Playgroud)

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


小智 1

查看ASP.NET 页面生命周期概述

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.
Run Code Online (Sandbox Code Playgroud)