2009-04-27 1 views
9

Ich suche ein Benutzer/Server-Steuerelement zu erstellen, die mit so etwas wie die folgenden erstellt werden:Erstellen eines ASP.NET-Benutzer/Server-Steuerelements, das eine Liste von asp: ListItem als untergeordnete Steuerelemente verwendet?

<my:MyListControl runat="server"> 
    <asp:ListItem Text="Test1" Value="Test1" /> 
    <asp:ListItem Text="Test2" Value="Test2" /> 
</my:MyListControl> 

ich hier für einen Start der Suche bin gerade: Artikel oder Codebeispiele.

Welche Basisklasse sollte ich erben? Was ist zu übersteuern?

Möglicherweise wie Sie anpassen, welche Unterelemente mein Steuerelement akzeptiert (my: ListItem statt asp: ListItem).

Was ich tun möchte, ist eine sehr einfache Brotkrumen Kontrolle für einen kleinen Abschnitt meiner Website zu erstellen. Ich habe alles mit Aktien-ASP.NET-Steuerelemente arbeiten, aber die Elemente werden in Code hinzugefügt, was bedeutet, dass das Korrigieren eines Rechtschreibfehlers oder Formatierungsfehlers eine Neukompilierung beinhaltet, was nicht ideal ist.

EDIT:

Hier ist mein Code mit dem Zusatz Vorschlag Josh unter:

Namespace MySite.Controls Teil Klasse Breadcrumbs Erbt Usercontrol

Private m_BreadCrumbs As New List(Of BreadCrumbItem) 

    <PersistenceMode(PersistenceMode.InnerProperty)> _ 
    Public Property Items() As List(Of BreadCrumbItem) 
     Get 
      Return m_BreadCrumbs 
     End Get 
     Set(ByVal value As List(Of BreadCrumbItem)) 
      m_BreadCrumbs = value 
     End Set 
    End Property 

    Private Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load 
     Bind() 
    End Sub 

    Private Sub Bind() 
     lvCrumbs.DataSource = Items 
     Me.DataBind() 
    End Sub 
End Class 

Public Class BreadCrumbItem 
    Private m_Text As String 
    Public Property Text() As String 
     Get 
      Return m_Text 
     End Get 
     Set(ByVal value As String) 
      m_Text = value 
     End Set 
    End Property 

    Private m_Url As String 
    Public Property Url() As String 
     Get 
      Return m_Url 
     End Get 
     Set(ByVal value As String) 
      m_Url = value 
     End Set 
    End Property 
End Class 

End Namespace

Dann Mein Seitencode sieht so aus:

<%@ Page Language="VB" AutoEventWireup="false" Inherits="MySite.MyPage" Title="My Page" Codebehind="MyPage.aspx.vb" %> 
<%@ Register TagPrefix="my" Namespace="MySite.Controls" Assembly="MySite" %> 
<my:BreadCrumbs ID="breadcrumbs" runat="server"> 
    <Items> 
     <my:BreadCrumbItem Text="Another page" Url="AnotherPage.aspx" /> 
    </Items> 
</my:BreadCrumbs> 
+0

Wie hoch ist das HTML-Markup-Ziel? Etwas wie:

  • Test1
  • Test2
Was ist die Notwendigkeit für ListItem verwenden und nicht eine andere Art? – ahsteele

+0

Ja, der HTML-Code, den ich ausspucke, ist ul/li. Es gibt keine Notwendigkeit für asp: ListItem, wusste nur nicht, was sonst noch zu nennen, wenn ich die Frage – slolife

Antwort

11

Sie können eine Eigenschaft auf eine hinter wie Code der Benutzersteuerung hinzufügen:

[PersistenceMode(PersistenceMode.InnerProperty)] 
public List<ListItem> Items 
{ 
    get; 
    set; 
} 

Ihr Markup wäre dann:

<my:MyListControl runat="server"> 
    <Items> 
    <asp:ListItem/> 
    </Items> 
</my:myListControl> 

zu machen, so ListItem Ihr eigene Liste Element sein kann (Was ich empfehlen im Gegensatz zu asp.net zu verwenden.) Sie möchten Ihre eigene Klasse erstellen.

Hier ist ein Beispiel für einen Server Control Ich benutze (I entfernt dies eine Menge des Rauschens als solche nur ein Skelett):

[ToolboxData("<{0}:Menubar runat=server></{0}:Menubar>")] 
    [System.ComponentModel.DesignTimeVisible(false)] 
    public class Menubar : WebControl, IPostBackEventHandler 
    { 

     private List<MenuItem> _menuItems = new List<MenuItem>(); 
     [PersistenceMode(PersistenceMode.InnerProperty)] 
     public List<MenuItem> MenuItems 
     { 
      get 
      { 
       return _menuItems; 
      } 
     } 

    } 
    [ToolboxItem(false)] 
    [ParseChildren(true, "MenuItems")] 
    public class MenuItem 
    { 
     private string _clientClick; 
     private List<MenuItem> _menuItems = new List<MenuItem>(); 

     [Localizable(true)] 
     public string Title { get; set; } 
     public string Href { get; set; } 
     public string Id { get; set; } 
     [PersistenceMode(PersistenceMode.InnerDefaultProperty)] 
     public List<MenuItem> MenuItems 
     { 
      get { return _menuItems; } 
      set { _menuItems = value; } 
     } 
    } 

Jetzt kann ich diese wie verwenden:

<my:Menubar runat="server" ID="menuBar"> 
    <MenuItems> 
     <my:MenuItem Title="Save" Href="javascript:saveItem(this);" /> 
     <my:MenuItem Title="Print" Href="javascript:void(0);"> 
      <MenuItems> 
       <my:MenuItem Title="Preview" Href=""/> 
       <my:MenuItem Title="To Pdf" Href="javascript:"/> 
      </MenuItems> 
     </my:MenuItem> 
    </MenuItems> 
</my:Menubar> 
+0

Dies scheint, was ich brauche.Meine einzige auflegen ist jetzt, warum meine @Register TagPrefix = "meine" Namespace = "MySite.Controls" nicht funktioniert, um die benutzerdefinierte Liste Element Klasse zu bekommen? Irgendwelche Ideen? Es erhält das übergeordnete Steuerelement (Menüleiste in Ihrem Beispiel), aber ich kann nicht mein: MyListItem innerhalb des Items-Tags. – slolife

+0

Keine Ideen können Sie den Code teilen, den Sie haben? – JoshBerke

+0

Macht nichts. Zum Hinzufügen des Assembly-Parameters zur @Register-Direktive. Jetzt funktioniert es. Danke Josh – slolife

0

Verwenden Sie einen asp: Repeater und binden Sie ihn dann an eine Liste der Objekte, die Sie in Ihrem Breadcrumb haben möchten. Sie können die Vorlage verwenden, um die Elemente selbst und die Trennzeichen anzupassen.

+0

Ich wollte etwas etwas definierter als die Repeater-Kontrolle – slolife