Шаблоны оформления релизованный на контролах)
От: ketoff  
Дата: 10.12.04 08:04
Оценка:
Стоит задача создать механизм позволяющий легко изменять оформление сайта (asp.net приложения).
Вот обычная страница default.aspx, которая содержит контрол, который отображает внутри заданного HTML-оформления (шаблона) все что лежит между тегами <body></body>

<%@ Page Language="c#" codeBehind="default.aspx.cs" AutoEventWireup="false" Inherits="CompanyName.CustomPage" %>
<%@ Register TagPrefix="example" TagName="template" Src="/include/templates/template1.ascx"%>
<example:template title="net" runat="server" id="template">
    <body>
       <h1>Hello world!</h1>
     </body>
</example:template>


Статическое содержание показывается безупречно, динамические страницы без параметров — тоже.
У меня проблема с тем, что если внутри этого контрола вставить другие контролы, например <asp:TextBox>

Код:
<%@ Page Language="c#" codeBehind="default.aspx.cs" AutoEventWireup="false" Inherits="CompanyName.CustomPage" %>
<%@ Register TagPrefix="example" TagName="template" Src="/include/templates/template.ascx"%>
<example:template title="net" runat="server" id="template">
    <body>
            <h1>Hello world!</h1>
            <asp:TextBox id="TextBox1" runat="server">
        </body>
</example:template>



...я не могу обратиться к этим контролам.
Вопрос:
Как к этим контролам обращаться, как изменить их состояние, содержимое?
Я в обработчике Page_Load для страницы (в default.aspx.cs в Page_Load) побежался по всем контролам — но TextBox1 там нет! Мой контрол есть template, а его дочерних (TextBox1) нет.

Код default.aspx.cs

private void Page_Load(object sender, System.EventArgs e)
{
  exploreControls(this);
}

private void exploreControls(Control ctrl)
{
  Response.Output.Write("<li>" + ctrl.ToString() + ctrl.UniqueID + ctrl.ClientID + ctrl.HasControls);
  if(ctrl.Controls.Count > 0)
  {
   Response.Output.Write("<ul>");
   for(int i = 0; i < ctrl.Controls.Count; i++ )
    exploreControls(ctrl.Controls[i]);
    Response.Output.Write("</ul>");
   }
}


Предположение: может в момент вызова Page_Load для страницы дочерние элементы моего контрола еще не созданы?
(кстати Page_Load для контрола их тоже не видит)
В каком месте программы я могу извлечть значения контрола TextBox1 по IsPostBack?
Буду благодарен за любую помощь...

Может кто порекомендует, как можно еще создать шаблон оформления с минимизацией повторяемого кода внутри страниц.

Спасибо.
Re: Шаблоны оформления релизованный на контролах)
От: Grey-  
Дата: 10.12.04 08:14
Оценка:
Здравствуйте, ketoff, Вы писали:

ВОспользуйся поиском по форуму, эту праблему не раз обсуждали, а на Page_Load темплейт ещё не подгрузился поэтому его там нет
Re[2]: Шаблоны оформления релизованный на контролах)
От: ketoff  
Дата: 10.12.04 09:24
Оценка:
Здравствуйте, Grey-, Вы писали:
G>Здравствуйте, ketoff, Вы писали:
G>ВОспользуйся поиском по форуму, эту праблему не раз обсуждали, а на Page_Load темплейт ещё не подгрузился поэтому его там нет

Спасибо, Grey. первым делом я поискал, конечно.
И даже вопрос в один из тех топиков кинул — безответно.
Но все же рискну продолжить...
вот класс шаблона template.ascx.cs
public abstract class Template : UserControl, INamingContainer
{
      [ParseChildren(true)]
      protected System.Web.UI.WebControls.PlaceHolder bodyContainer;
      // ... тут обявлены контролы общие для всех страниц (меню и прочее)
      private ITemplate main;
      public ITemplate Body
      {
         get { return this.main; }
         set { this.main = value; }
      }

      public void LoadChildControls()
      {
    this.EnsureChildControls();
      }
      
      protected override void CreateChildControls()
      {
        // здесь заполняются контролы общие для всех страниц (меню и прочее)
       if( null != this.Body ) // здесь помещаем содержимое страницы, то что внутри тегов body в плейсхолдер bodyContainer
       this.Body.InstantiateIn(bodyContainer);
      }
      // ... прикладной код
}


template.ascx файл шаблона:

<%@ Control Language="c#" AutoEventWireup="false" Codebehind="template.ascx.cs" Inherits="Example.Includes.Template" %>
<!--HTML-код и общие для сайта контролы-->
<asp:placeholder id="bodyContainer" runat="server"></asp:placeholder>
<!--HTML-код и общие для сайта контролы-->


Вопрос:
Если внутри Body содержатся контролы они будут вообще распознаны? или они воспринимаются как текст и не парсятся?
Re[3]: Шаблоны оформления релизованный на контролах)
От: ketoff  
Дата: 10.12.04 09:31
Оценка:
Кстати, сам контрол шаблона в на Page_Load уже создан!
Вот результат выполнения exploreControls опис в первом посте


ASP.default_aspx :True - Page_Load страницы
   System.Web.UI.LiteralControl _ctl0 _ctl0 :False  - статический HTML страницы
   ASP.template_ascx template template :True
          System.Web.UI.WebControls.PlaceHolder template:bodyContainer template_bodyContainer :False - Плейсхолдер
System.Web.UI.LiteralControl _ctl1 _ctl1 :False - статический HTML страницы
Re: Шаблоны оформления релизованный на контролах)
От: Zerger Россия  
Дата: 10.12.04 09:44
Оценка:
Здравствуйте, ketoff, Вы писали:

K>...я не могу обратиться к этим контролам.

K>Вопрос:
K>Как к этим контролам обращаться, как изменить их состояние, содержимое?

Для получени ссылки на объект по его ID следует воспользоваться функцией FindControl. При этом нужно учитывать, что FindControl ищет в пределах одного INamingContainer.
Re[3]: Шаблоны оформления релизованный на контролах)
От: Grey-  
Дата: 10.12.04 09:47
Оценка:
Здравствуйте, ketoff, Вы писали:


K>Если внутри Body содержатся контролы они будут вообще распознаны? или они воспринимаются как текст и не парсятся?


Почему не воспользоватся более тревиальным способом Controls.Add а не формируя контент ?
Re: Шаблоны оформления релизованный на контролах)
От: BorisD  
Дата: 10.12.04 11:44
Оценка: -1
Как вариант использования контролов для офрмления дизайна можно воспользоваться таким методом:

1-ый контрол вставляет теги head, title, etc.
2-ой второй ричует менюшку и создает табдицу с открытой строкой <tr><td>
....
Здесь контент
..........
3-й закрывает строку и таблицу



Здравствуйте, ketoff, Вы писали:

K>Стоит задача создать механизм позволяющий легко изменять оформление сайта (asp.net приложения).

K>Вот обычная страница default.aspx, которая содержит контрол, который отображает внутри заданного HTML-оформления (шаблона) все что лежит между тегами <body></body>

K>
K><%@ Page Language="c#" codeBehind="default.aspx.cs" AutoEventWireup="false" Inherits="CompanyName.CustomPage" %>
K><%@ Register TagPrefix="example" TagName="template" Src="/include/templates/template1.ascx"%>
K><example:template title="net" runat="server" id="template">
K>    <body>
K>       <h1>Hello world!</h1>
K>     </body>
K></example:template> 
K>


K>Статическое содержание показывается безупречно, динамические страницы без параметров — тоже.

K>У меня проблема с тем, что если внутри этого контрола вставить другие контролы, например <asp:TextBox>

K>Код:

K>
K><%@ Page Language="c#" codeBehind="default.aspx.cs" AutoEventWireup="false" Inherits="CompanyName.CustomPage" %>
K><%@ Register TagPrefix="example" TagName="template" Src="/include/templates/template.ascx"%>
K><example:template title="net" runat="server" id="template">
K>    <body>
K>            <h1>Hello world!</h1>
K>            <asp:TextBox id="TextBox1" runat="server">
K>        </body>
K></example:template> 
K>



K>...я не могу обратиться к этим контролам.

K>Вопрос:
K>Как к этим контролам обращаться, как изменить их состояние, содержимое?
K>Я в обработчике Page_Load для страницы (в default.aspx.cs в Page_Load) побежался по всем контролам — но TextBox1 там нет! Мой контрол есть template, а его дочерних (TextBox1) нет.

K>Код default.aspx.cs


K>
K>private void Page_Load(object sender, System.EventArgs e)
K>{
K>  exploreControls(this);
K>}

K>private void exploreControls(Control ctrl)
K>{
K>  Response.Output.Write("<li>" + ctrl.ToString() + ctrl.UniqueID + ctrl.ClientID + ctrl.HasControls);
K>  if(ctrl.Controls.Count > 0)
K>  {
K>   Response.Output.Write("<ul>");
K>   for(int i = 0; i < ctrl.Controls.Count; i++ )
K>    exploreControls(ctrl.Controls[i]);
K>    Response.Output.Write("</ul>");
K>   }
K>}
K>


K>Предположение: может в момент вызова Page_Load для страницы дочерние элементы моего контрола еще не созданы?

K>(кстати Page_Load для контрола их тоже не видит)
K>В каком месте программы я могу извлечть значения контрола TextBox1 по IsPostBack?
K>Буду благодарен за любую помощь...

K>Может кто порекомендует, как можно еще создать шаблон оформления с минимизацией повторяемого кода внутри страниц.


K>Спасибо.
Re[2]: Шаблоны оформления релизованный на контролах)
От: ketoff  
Дата: 21.12.04 06:48
Оценка:
Здравствуйте, BorisD,
Но в этом случае код контролов будет присутствовать на каждой aspx странице?
Это можно сравнить с <#include file="">?
Я правильно понял?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.