Я пытаюсь преобразовать пользовательский элемент управления в строку. Приложение настроено так, чтобы позволить пользователю использовать токены, и пользовательские элементы управления отображаются там, где находятся токены.
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 элемента управления, не запускается. В элементе управления есть повторитель, который должен стрелять.





Вам нужно будет прикрепить элемент управления к странице, добавив его в коллекцию элементов управления страницы или элемента управления на странице. Это не решит всех ваших проблем, если вы не сделаете что-то, чтобы явно отключить рендеринг во время обычного события рендеринга страницы.
Я довольно давно использую следующий код, предоставленный Скоттом Гатри в его блоге:
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 включает динамическую загрузку данных в пользовательский элемент управления и может использоваться для вставки более одной переменной в элемент управления через массив или что-то подобное.
Этот код запускает все обычные события в элементе управления.
Вы можете прочитать больше об этом здесь
С уважением Джеспер Хауге
Именно то, что я искал! Спасибо
Это не работает, когда вы пытаетесь использовать async / await внутри UserControl.
Я взял метод Хауге / Скотта Гатри, описанный выше, и настроил его так, чтобы вам не нужно было использовать отражение или изменять UserControl для реализации какого-либо специального интерфейса. Ключевым моментом было то, что я добавил строго типизированный обратный вызов, который вызывает метод RenderView выше, вместо того, чтобы выполнять отражение.
Я написал вспомогательный метод и использование здесь
HTH, Джон
Этот HttpContext.Current.Server.Execute (pageHolder, result, false); это деньги