2009-04-27 8 views
9

Sto cercando di creare un controllo utente/server che verrà creato con qualcosa come il seguente:Come creare il controllo utente/server ASP.NET che utilizza un elenco di asp: ListItem come controlli figlio?

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

io sono solo alla ricerca di un nuovo inizio qui: articoli o esempi di codice.

Quale classe di base devo ereditare da? Cosa sovrascrivere?

Possibilmente come personalizzare quali elementi secondari accetta il mio controllo (my: ListItem anziché asp: ListItem).

Quello che sto cercando di fare è creare un controllo della briciola di pane molto semplice per una piccola sezione del mio sito. Ho tutto ciò che funziona con controlli ASP.NET di serie, ma gli articoli sono aggiunti nel codice, il che significa che correggere un errore di ortografia o un bug di formattazione comporta una ricompilazione, che non è l'ideale.

EDIT:

Ecco il mio codice con l'aggiunta di suggerimento di Josh di seguito:

Namespace MySite.Controls pangrattato classe parziale riceve 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

Poi il mio codice di pagina assomiglia a questo:

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

Qual è l'obiettivo di markup HTML finale? Qualcosa di simile:

  • Test1
  • Test2
Qual è la necessità di utilizzare ListItem e non qualche altro tipo? – ahsteele

+0

Sì, l'HTML che sto trasmettendo è ul/li. Non c'è bisogno di asp: ListItem, semplicemente non sapevo cos'altro chiamarlo quando ho posto la domanda – slolife

risposta

11

È possibile aggiungere una proprietà sul codice di un controllo utente dietro come:

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

tuo markup sarebbe allora:

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

fare in modo ListItem può essere il proprio elemento della lista (Che consiglio di fare piuttosto che usare asp.net.) Dovrai creare la tua classe.

Ecco un esempio di un controllo server che uso (ho tolto un sacco di rumore in quanto tale, questo è solo uno scheletro):

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

Ora posso usare questo tipo:

<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

Questo sembra essere quello di cui ho bisogno.Il mio unico riaggancio ora è perché il mio @Register TagPrefix = "mio" Namespace = "MySite.Controls" non funziona per ottenere la classe dell'elemento dell'elenco personalizzato? Qualche idea? Ottiene il controllo genitore (barra dei menu nel tuo esempio) ma non riesco a fare my: MyListItem all'interno del tag Items. – slolife

+0

Nessuna idea è possibile condividere il codice che hai ottenuto? – JoshBerke

+0

Non importa. Necessario aggiungere il parametro Assembly alla direttiva @Register. Ora funziona. Grazie Josh – slolife

0

Usa un asp: ripetitore quindi associalo a un elenco degli oggetti che desideri nel tuo breadcrumb. È possibile utilizzare il modello per personalizzare gli elementi stessi e i separatori.

+0

Volevo qualcosa un po 'più definito del controllo del ripetitore – slolife

Problemi correlati