2009-05-03 12 views
5

Qualcuno potrebbe provare a consigliare la migliore causa di azione per risolvere la richiesta di seguito:. Equivalente ripetitore netto per un singolo oggetto?

Ho creato un numero di classi estese utilizzando la classe Repeater come base e amo la flessibilità, la facilità e i risultati di questa operazione . Quello che voglio fare ora è creare un controllo Web personalizzato simile per un singolo oggetto (vale a dire che DataSource non implementa un IListSource o IEnumerable). Ho creato la struttura di ciò che sto cercando di ottenere estendendo il ripetitore e quindi quando si imposta l'origine dati utilizzando un elenco di 1 elemento per contenere l'oggetto e quindi l'associazione dati.

e.g a rough example: 

    Dim oObj as New MyObject(1) 
    Dim gl As New Generic.List(of MyObiect)() 
    gl.Add(oObj) 
    rpt.DataSource = gl 
    rpt.DataBind() 

Questo sembra come un piccolo trucco intorno alle cose, quello che vorrei essere in grado di fare è la seguente:

e.g new call, where my control is the new custom control: 

    Dim oObj as New MyObject(1) 
    myControl.DataSource = oObj 
    myControl.DataBind() 

Voglio poter definire questo controllo personalizzato con diverse variabili e proprietà, il cui risultato consentirà il seguente tipo di layout:

<My:ObjControl ID="frm" runat="server"> 
    <Tabs> 
     <My:Tab name="Details"> 
      <Items> 
       <My:Item Type="Text" Label="First Name" Property="FirstName" /> 
       <My:Item Type="Text" Label="Last Name" Property="LastName" /> 
       <My:Item Type="Text" Label="Title" Property="Title" /> 
      </Items> 
     </Tab> 
     <My:Tab name="Address"> 
      <Items> 
       <My:Item Type="Text" Label="Address 1" Property="Address1" /> 
       <My:Item Type="Text" Label="Address 2" Property="Address2" /> 
       <My:Item Type="Text" Label="Address 3" Property="Address3" /> 
      </Items> 
     </Tab> 
    </Tabs> 
</My:ObjControl> 

Questa implementazione deve avvenire utilizzando WebForms, anche se sembra usando MVC sarebbe il metodo ideale considerando quanto sopra. In questo modo, desidero creare un WebControl flessibile che utilizza la reflection (che può essere utilizzata per tutte le classi che implementano un'interfaccia specifica) che genererà il modulo richiesto con solo le tre righe di codice dietro (sopra) ogni volta che è necessario.

Devo solo aggiungere una proprietà a un ripetitore personalizzato (DataObject) che prende un oggetto e imposta DataSource di conseguenza e risparmiando tempo? O c'è un modo migliore?

Spero che tutto abbia senso!

Cheers, Steve

risposta

5

Stai cercando modo per difficile da ottenere intorno al fatto che il ripetitore vuole una lista e si vuole dare 1 istanza. Basta avvolgerlo in una nuova lista * oObj) e andare avanti. È fatto tutto il tempo

Sicuramente non so cosa diavolo sta succedendo con quel controllo server personalizzato. Mi sembra che tu stia provando troppo duramente.

<asp:repeater id="whatever" runat=server> 
    <ItemTemplate>First Name: <%# DataBinder.Eval(Container.DataItem,"FirstName") %></ItemTemplate> 
</asp:repeater> 
+0

Ok, è molto difficile superare il processo del pensiero, ma ciò che il mio controllo raggiungerà è produrre una pagina con due linguette "Dettagli" e "Indirizzo" che possono essere compressi tra e su ognuno di essi avrà etichette e corrispondenza forma gli elementi che possono aggiornare l'oggetto. Ciò che hai mostrato ha mancato completamente il punto, probabilmente è colpa mia nella formulazione della domanda. Naturalmente nella tua e.g potevo solo fare: Eval ("FirstName"). – stibstibstib

+1

Ancora eccessivo per fare questo lavoro molto per un paio di schede e consiglio ancora un ripetitore. Sì, non capisco la tua domanda completamente. Non uso Eval, DataBinder.Eval è il modo 1.0 per farlo e non vedo alcun motivo per cambiare ancora, Habit. –

2

Capisco perfettamente il tuo punto di vista, stibstibstib. Vorrei anche che ASP.NET Framework venisse fornito con un controllo server basato su template come ListView ma per un singolo oggetto dati. Sembra inutile, e sembra un po '"hakish", creare una lista da un singolo oggetto solo per farlo funzionare con Repeater e ListView. Capisco che funzioni. Capisco che è una soluzione semplice. Ma ASP.NET è un Framework e sembra proprio un'omissione da correggere. Questo articolo http://gadgetopia.com/post/5343 riguarda lo stesso concetto, ovvero che esistono due modi fondamentali per visualizzare il contenuto di un sito Web: come singolo elemento e come elemento nell'elenco. Ancora sorpreso ASP.NET non ha qualcosa come un controllo server ItemView

1

In alcune situazioni è possibile utilizzare uno DetailsView.