Шаблон страницы, основанный на User Control'ах
От: egaron http://127.0.0.1
Дата: 07.04.05 12:24
Оценка:
Ситуация такая. В начале каждой страницы проекта должен находиться контрол 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);

}

здесь есть какая-то хитрость, может кто подскажет в чем дело и как сие победить ?
Re: Шаблон страницы, основанный на User Control'ах
От: shapkin Великобритания  
Дата: 08.04.05 23:41
Оценка:
Здравствуйте, 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, тогда, например, в юзер-контролах будут работать события и датабайндинг.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.