Событие LoadControl и Page_Load не запускается - PullRequest
9 голосов
/ 01 октября 2009

Привет всем! Я загружаю 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 элемента управления вообще не срабатывает. Если я добавлю еще одну функцию и вызову ее до добавления элемента управления в коллекцию элементов управления страницы, эта функция сработает, но событие Page_Load не сработает.

Есть идеи, ребята? Спасибо всем!

Ответы [ 3 ]

4 голосов
/ 14 мая 2011

Насколько я знаю, невозможно выполнять события при динамическом рендеринге элементов управления. Но у меня есть хитрость в рендеринге пользовательских элементов управления, которая работает.

Я использую функцию для визуализации пользовательского элемента управления, который принимает физический путь пользовательского элемента управления, и список свойств. Я определяю специальное свойство в пользовательском элементе управления, которое может быть похоже на метод, и когда я его устанавливаю, запускаю свой пользовательский код. Это функция рендеринга:

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 и, если оно установлено, вручную вызвать методы, которые обычно вызывают события.

1 голос
/ 19 апреля 2011

check Обзор жизненного цикла страницы 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.
0 голосов
/ 01 мая 2011

Добавить элемент управления на этапе 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);
...