10

大家好!我正在通过 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 事件不会触发。

有什么想法吗,伙计们?谢谢大家!

4

3 回答 3

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

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

于 2011-05-14T18:56:21.520 回答
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.
于 2011-04-19T10:19:32.413 回答
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);
于 2011-05-01T03:27:13.870 回答