Загрузить компонент ascx с помощью кода C#
есть ли способ, которым я могу использовать C# для загрузки, а затем "визуализировать" элемент управления ascx?
по существу, я пытаюсь заменить встроенный ASP функцией C#, которая вернет тот же HTML. Это позволило бы мне установить его как webmethod, чтобы я мог обновить этот раздел страницы с помощью jQuery, используя тот же код, который сгенерировал исходный html.
Мне действительно нужен какой-то способ сделать это, и это кажется логичным маршрут.
5 ответов
вам нужно создать страницу, на которой вы отображаете элемент управления:
public static string RenderUserControl(string path)
{
Page pageHolder = new Page();
Control viewControl = pageHolder.LoadControl(path);
pageHolder.Controls.Add(viewControl);
using(StringWriter output = new StringWriter())
{
HttpContext.Current.Server.Execute(pageHolder, output, false);
return output.ToString();
}
}
пользовательский элемент управления сам по себе не окажет. (в этой статье имеет некоторую связанную информацию, из которой я заимствовал некоторый код).
этой объяснение должны иметь ответы, которые вы ищете. В основном вы должны объявить элемент управления на странице, а затем LoadControl в codebehind.
Я не пробовал это, но вы можете загрузить элемент управления с помощью функции LoadControl:
Control Example = LoadControl("~\Controls\MyControl.ascx");
затем вы можете попробовать отрисовку элемента управления:
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
Example.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();
но убедитесь, что вы переопределяете VerifyRenderingInServerForm и переключаете EnableEventValidation на false на странице.
забудьте, что я написал выше. Я вернулся и протестировал, и вы не можете вызвать LoadControl, потому что webmethod статичен. Поскольку он статический, у вас нет объекта Page для вызова... Который означает отсутствие динамической загрузки пользовательских элементов управления.
ответ Keltex был единственным, который работал для меня, так как я работал с вложенными пользовательскими элементами управления. Кроме того, если вы хотите передать параметры в свой пользовательский элемент управления, вы можете сделать это:
_MyNameSpace_MyUserControl viewcontrol = (_MyNameSpace_MyUserControl) pageHolder.LoadControl(path);
viewcontrol.MyParam = "My value";