Загружать компонент ascx с помощью кода С#

Есть ли способ, которым я могу использовать С# для загрузки, а затем "визуализировать" элемент управления ascx?

По сути, я пытаюсь заменить встроенный ASP на функцию С#, которая вернет тот же HTML. Это позволило бы мне установить его как веб-метод, чтобы я мог обновить этот раздел страницы с помощью jQuery, используя тот же код, который сгенерировал исходный html.

Мне действительно нужен какой-то способ сделать это, и это похоже на логический маршрут.

Ответ 1

Вам нужно создать страницу, на которой вы выполняете управление:

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

Пользовательский элемент управления сам по себе не будет отображаться. (В этой статье есть некоторая связанная информация, из которой я заимствовал некоторый код).

Ответ 2

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

Ответ 3

Этот Объяснение должен иметь ответы, которые вы ищете. В основном вам нужно объявить элемент управления на странице, затем LoadControl в коде.

Ответ 4

Ответ Keltex был единственным, который работал у меня, так как я работал с вложенными пользовательскими элементами управления. Кроме того, если вы хотите передать параметры своему пользовательскому элементу управления, вы можете сделать это:

_MyNameSpace_MyUserControl viewcontrol = (_MyNameSpace_MyUserControl) pageHolder.LoadControl(path);

viewcontrol.MyParam = "My value";

Ответ 5

его очень просто использовать:

yourItem.Controls.Add(LoadControl("~/user control File path"));