Ситуация такая. В начале каждой страницы проекта должен находиться контрол header, внизу — footer (контролы уже реализованы). То есть сейчас каждая страница выглядит примерно так
<%@ Register TagPrefix="uc1" TagName="header" Src="/tpl/header.ascx" %>
<%@ Register TagPrefix="uc1" TagName="footer" Src="/tpl/footer.ascx" %>
<%@ Page language="c#" Codebehind="Requests.aspx.cs" AutoEventWireup="false" Inherits="acs.admin.Requests" %>
<uc1:header id="Header1" runat="server"></uc1:header>
<form id="Form1" runat="server">
...................
</form>
<uc1:footer id="Footer1" runat="server"></uc1:footer>
Что хотелось бы — реализовать повторное использование этих контролов на сервере, то бишь попросту чтобы сервер сам выдавал некий шаблон страницы.
Для этого и для другой функциональности я создал производный от Page класс, в котором реализовал специфические для данного проекта методы (конекшн с БД и прочее).
public class FormPage:Page
{
protected SqlConnection cn;
private System.Collections.Specialized.NameValueCollection qs; //query string
private int user_id;
protected Hashtable htStates;
protected Hashtable htStateNames;
protected Hashtable htGroups;
protected SqlCommand cmd;
public int uid { get {return user_id;}}
Теперь хотелось бы "зашить" с этот класс и шаблон страницы — то бишь чтоб у нее сверху был контрол Header, снизу — Footer/
Если речь идет о стандартных серверных контролах асп, то сделать это элементарно — к примеру вывести обычный Label
protected override void Render( HtmlTextWriter writer)
{
lblRender.BackColor = System.Drawing.Color.Blue;
lblRender.RenderControl(writer);
uc1.RenderControl(writer);
base.Render(writer);
}
в данном случае lblRender появляется в начале хтмл-страницы.
а вот если проделать то же самое с UserControl'ом, то хтмл этого контрола не генерится
protected override void Render( HtmlTextWriter writer)
{
uc1 = new UserControl();
uc1.LoadControl(@"\tpl\header.ascx");
Controls.Add(uc1);
uc1.RenderControl(writer);
base.Render(writer);
}
здесь есть какая-то хитрость, может кто подскажет в чем дело и как сие победить ?
Здравствуйте, egaron, Вы писали:
E>здесь есть какая-то хитрость, может кто подскажет в чем дело и как сие победить ?
Вот этот кусок неправильный:
E> uc1 = new UserControl();
E> uc1.LoadControl(@"\tpl\header.ascx");
E> Controls.Add(uc1);
LoadControl возвращает созданный юзер контрол и вызывать нужно этот метод у текущей страницы:
MyUserControl control = LoadControl((@"/tpl/header.ascx);
Добавление контрола в коллекцию Controls, а потом запуск рендеринга вручную через RenderControl приведет к тому, что контрол покажется дважды.
Лучше всего в OnInit добавлять юзер контролы в коллекцию Controls страницы и не переопределять Render, тогда, например, в юзер-контролах будут работать события и датабайндинг.