2008-12-02 2 views
5

ASP.NET-основные страницы - важные вещи.Я хочу Мастер UserControl (главная страница, но для UserControls)

Однако у меня в моих проектах очень много похожих UserControls - это может быть стандартный макет для AJAX ModalPopup или что-то более активное.

Мне жаль, что я не смогу избавиться от некоторых из моих дублированных кодов (как в файлах ascx, так и в коде) с помощью некоторых мастеров UserControls.

Есть ли у кого-нибудь предложения по достижению этого?

ответ

2

Ближайшая вещь, которую я могу предложить, является то, что вы ищете, это templated custom control. К сожалению, совместное использование элементов управления над проектами намного проще, если эти вещи являются настраиваемыми элементами управления без файла ascx.

0

Наследование. Вы создаете базовый элемент управления как базовый класс, а затем наследуете его.

+2

Я сделал это для кодовой части вещей (т. мой файл UserControl.ascx.cs наследуется от моего BaseUserControl, а не System.Web.UI.UserControl. Однако это помогает мне с точки зрения добавления стандартных элементов управления HTML и сервера в мой базовый элемент управления. – 2008-12-02 15:26:30

0

Вы также можете разместить вложенный пользовательский элемент управления в держателе места в «главном» пользовательском элементе управления. Используйте метод Load, который принимает виртуальный путь к ascx-файлу для загрузки соответствующего элемента управления.

1

мне удалось получить эту работу, используя следующий код:

public class MasterLoader : UserControl 
{ 
    MasterUserControl _masterUserControl; 

    protected override void CreateChildControls() 
    { 
     Controls.Clear(); 
     base.CreateChildControls(); 

     Controls.Add(MasterControl); 
    } 

    protected override void AddedControl(Control control, int index) 
    { 
     if (control is MasterUserControl) 
      base.AddedControl(control, index); 
     else 
      MasterControl.ContentArea.Controls.Add(control); 
    } 

    private MasterUserControl MasterControl 
    { 
     get 
     { 
      if (_masterUserControl== null) 
       _masterUserControl= (MasterUserControl)LoadControl("~/MasterUserControl.ascx"); 

      return _masterUserControl; 
     } 
    } 
} 

пользовательские элементы управления Ребенок наследует от класса MasterLoader. Главный пользовательский элемент управления включал элемент управления закладок, который я опубликовал как публичное свойство, называемое ContentArea.

public partial class MasterUserControl: UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    public PlaceHolder ContentArea 
    { 
     get 
     { 
      return phContent; 
     } 
    } 
} 

Состояние привязки и просмотра событий, как и следовало ожидать, без каких-либо изменений в пользовательских элементах управления.

4

Это старый вопрос, но у меня есть надежное решение для всех, кто наткнулся на это.

в App_Code, создайте файл и вставьте этот код:

namespace MasterControls 
{ 
    // code written by alexander taylor on 2011-08-22. http://www.alexsapps.com 

    public abstract class ChildUserControl : UserControl 
    { 
     Control master; 

     public abstract string MasterControlVirtualPath { get; } 

     protected override void OnInit(EventArgs e) 
     { 
      master = LoadControl(MasterControlVirtualPath); 
      Controls.Add(master); 

      base.OnInit(e); 
     } 

     protected override void Render(HtmlTextWriter writer) 
     { 
      master.RenderControl(writer); 
     } 
    } 
    public class ControlContentPlaceHolder : Control 
    { 
     protected override void Render(HtmlTextWriter writer) 
     { 
      ControlContent found = null; 

      foreach (Control c in NamingContainer.NamingContainer.Controls) 
      { 
       ControlContent search; 
       search = c as ControlContent; 
       if (search != null && search.ControlContentPlaceHolderID.Equals(ID)) 
       { 
        found = search; 
        break; 
       } 
      } 

      if (found != null) 
      {     
       //write content of the ContentControl 
       found.RenderControl(writer); 
      } 
      else 
      { 
       //use default content 
       base.Render(writer); 
      } 
     } 
    } 
    public class ControlContent : Control 
    { 
     public string ControlContentPlaceHolderID { get; set; } 
    } 

} 

пример "Мастер управления" (эквивалент главной страницы)

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MasterControl1.ascx.cs" Inherits="MasterControl1" %> 
<%@ Register Namespace="MasterControls" TagPrefix="masterControls" %> 

<p>content 1 below:<br /> 
<masterControls:ControlContentPlaceHolder ID="myContent1" runat="server"> 
    default content 1 here! 
</masterControls:ControlContentPlaceHolder></p> 

<p>content 2 below:<br /> 
<masterControls:ControlContentPlaceHolder ID="myContent2" runat="server"> 
    default content 2 here! 
</masterControls:ControlContentPlaceHolder></p> 

пример "дочерний" (эквивалент страницы)

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ChildControl1.ascx.cs" Inherits="Control1" %> 
<%@ Register Namespace="MasterControls" TagPrefix="masterControls" %> 

<masterControls:ControlContent ControlContentPlaceHolderID="myContent1" runat="server"> 
    custom content 1 
</masterControls:ControlContent> 

<masterControls:ControlContent ControlContentPlaceHolderID="myContent2" runat="server"> 
    custom content 2 
</masterControls:ControlContent> 

в коде позади контроля ребенка

using MasterControls; 

//you must inherit the ChildUserControl class! 
public partial class Control1 : ChildUserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    public override string MasterControlVirtualPath 
    { 
     //below, type the location to the master control 
     //you wish to apply to this control 
     get { return "~/MasterControl1.ascx"; } 
    } 
} 
Смежные вопросы