Загрузить компонент 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";

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

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