загрузить пользовательский элемент управления программно в текстовый редактор HTML - PullRequest
6 голосов
/ 03 ноября 2008

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

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter writer = new HtmlTextWriter(sw);

Control uc = LoadControl("~/includes/HomepageNews.ascx");
uc.RenderControl(writer);
return sb.ToString();

Этот код отображает элемент управления, но ни одно из событий, вызванных в Page_Load элемента управления, не запускается. Повторитель в контроле должен стрелять.

Ответы [ 3 ]

13 голосов
/ 03 ноября 2008

Я уже довольно давно использую следующий код, предоставленный Скоттом Гатри в своем блоге:

public class ViewManager
{
    public static string RenderView(string path, object data)
    {
        Page pageHolder = new Page();
        UserControl viewControl = (UserControl) pageHolder.LoadControl(path);

        if (data != null)
        {
            Type viewControlType = viewControl.GetType();
            FieldInfo field = viewControlType.GetField("Data");
            if (field != null)
            {
                field.SetValue(viewControl, data);
            }
            else
            {
                throw new Exception("ViewFile: " + path + "has no data property");
            }
        }

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

Параметр object data позволяет динамически загружать данные в пользовательский элемент управления и может использоваться для ввода более одной переменной в элемент управления через массив или что-то подобное.

Этот код будет запускать все обычные события в элементе управления.

Подробнее об этом можно прочитать здесь

С уважением Джеспер Хауге

2 голосов
/ 03 ноября 2008

Вам нужно будет прикрепить элемент управления к странице, добавив его в коллекцию элементов управления страницы или элемента управления на странице. Это не решит все ваши проблемы, если вы не сделаете что-то, чтобы явно отключить рендеринг во время обычного события рендеринга страницы.

1 голос
/ 29 октября 2009

Я взял описанный выше метод Хауге / Скотта Гатри и настроил его так, что вам не нужно использовать отражение или модифицировать UserControl для реализации какого-либо специального интерфейса. Ключ был в том, что я добавил строго типизированный обратный вызов, который выше вызывает метод RenderView, вместо того, чтобы делать отражение.

Я написал в блоге вспомогательный метод и использование здесь

НТН, Jon

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...