2008-12-02 5 views
5

ASP.NET Masterseiten - wesentliche Dinge.Ich möchte ein Master UserControl (eine Master-Seite, aber für UserControls)

Allerdings habe ich viele sehr ähnliche UserControls in meinen Projekten - es könnte ein Standardlayout für ein AJAX ModalPopup sein, oder etwas, das mehr involviert ist.

Ich wünschte, ich könnte einige meiner duplizierten Code (sowohl in Ascx-Dateien und Code-Behind) mit einigen Master UserControls loswerden.

Hat jemand irgendwelche Vorschläge für einen Weg, dies zu erreichen?

Antwort

2

Das nächste, was ich vorschlagen kann für das, was Sie suchen, ist ein templated custom control. Leider ist es viel einfacher, Steuerelemente projektübergreifend zu teilen, wenn es sich um benutzerdefinierte Steuerelemente ohne eine ascx-Datei handelt.

0

Vererbung. Sie erstellen das Basissteuerelement als eine Basisklasse und erben dann daraus.

+2

Ich habe dies für die Code-Behind Seite der Dinge getan Meine UserControl.ascx.cs-Datei erbt von meinem BaseUserControl lieber als System.Web.UI.UserControl. Dies hilft mir jedoch beim Hinzufügen von Standard-HTML- und Serversteuerelementen zu meiner Basissteuerung. –

0

Sie könnten auch geschachtelte Benutzersteuerelemente auf einem Platzhalter-Steuerelement in einem "Master" -Benutzerelement platzieren. Verwenden Sie die Load-Methode, die den virtuellen Pfad zur ascx-Datei akzeptiert, um das entsprechende Steuerelement zu laden.

1

ich es geschafft, dies mit dem folgenden Code zur Arbeit zu kommen:

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; 
     } 
    } 
} 

Kinder Bedienelemente von der MasterLoader Klasse erben. Das Master-Benutzersteuerelement enthielt ein Platzhalter-Steuerelement, das ich als öffentliche Eigenschaft namens ContentArea verfügbar gemacht hatte.

Ereignisbindung und Ansichtszustand funktionieren wie erwartet, ohne dass die Benutzersteuerelemente geändert werden.

4

Dies ist eine alte Frage, aber ich habe eine robuste Lösung für jeden, der darüber stolpert.

in app_code, erstellen Sie eine Datei und fügen Sie diesen 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; } 
    } 

} 

Beispiel "Master-Steuerung" (entspricht der Master-Seite)

<%@ 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> 

Beispiel "Kinder control" (entspricht der Seite)

<%@ 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> 

in der Code-behind des Kindes Steuer

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"; } 
    } 
}