Я создал обычный пользовательский элемент управления ASP.NET, включая файл ascx. Например:
MyUserControl.ascx
MyUserControl.ascx.cs
Затем я пытаюсь визуализировать элемент управления вручную во время выполнения, используя код, похожий на следующий код:
var testMyUserControl = new MyUserControl();
var textWriter =
new HtmlTextWriter(
new System.IO.StringWriter(new StringBuilder()));
testMyUserControl.RenderControl(textWriter);
Console.Write(textWriter.InnerWriter.ToString());
Кажется, что ничего из того, что я помещаю в файл ASCX, не отображается - ни статический HTML, ни какие-либо элементы управления .NET.
Однако если я переопределю метод Render () в коде программной части и вручную выведу контент, он будет отображаться.
Что мне здесь не хватает?





Вам не нужно самому отдавать контроль. Если вам нужно добавить его на страницу динамически, вы делаете это так:
UserControl myControl = (UserControl) Page.LoadControl("~/Controls/MyControl.ascx");
Page.Controls.Add(myControl);
Скорее всего, вы захотите разместить его в определенной части страницы, поэтому вместо использования Page.Controls используйте заполнитель:
<asp:Placeholder ID = "myPlaceHolder" runat = "server" />
и используйте такой код:
myPlaceholder.Controls.Add(myControl);
Это лучший способ добавить элемент управления динамично, но если бы вы могли сделать это декларативно, это было бы намного проще.
<%@ Register TagPrefix = "my" TagName = "Control" Src = "~/Controls/MyControl.ascx" %>
<my:Control ID = "myControl" runat = "server" />
Помните: если вы добавляете элемент управления динамически, обязательно используйте повторно добавлять элемент управления при каждой загрузке страницы.
Вы не можете. Для метода LoadControl требуется виртуальный путь от веб-сервера (Casini, IIS). Это единственный способ использования UserControl.
Предлагаемый вами метод работал бы нормально, если бы я делал это внутри проекта веб-сайта, но как бы я сделал это, скажем, в консольном приложении, внутри обычного класса, который не расширяет Page?