Domanda

Sono nuovo ai controlli utente, ne ho creato solo uno finora, quindi abbi pazienza.Ho letto oggi che i controlli utente dovrebbero essere autonomi e non fare affidamento su alcuna informazione dal contenitore principale.Capisco quella parte, ma quello che ho difficoltà a capire è il modo "giusto" di progettare il mio programma attorno a quel principio.

Sto creando un modulo Web in C# in cui è presente una pagina con un controllo utente in quella pagina.Ho creato usercontrol nel suo file ascx e l'ho trascinato nella mia pagina aspx.Il controllo utente è costituito da un paio di caselle di data e da una visualizzazione a griglia per mostrare i risultati di una procedura memorizzata SQL.

Mi piacerebbe davvero riutilizzare questo controllo, ma non riesco a capire come "dire" al controllo utente quale procedura memorizzata vorrei eseguire per la pagina specifica in cui mi trovo senza violare il "non fare affidamento su la regola del contenitore padre".

Grazie

È stato utile?

Soluzione

Non fare affidamento sul contenitore principale non significa che non puoi comunicare.Esporre una proprietà nel controllo utente che verrà impostata dal genitore.Ma hanno un valore predefinito in modo che non si blocchi.

Inoltre, se si tratta di un controllo molto specifico, non c'è motivo per cui sarebbe sbagliato fare affidamento sul genitore.Potrebbe non essere l'ideale, ma utilizzeresti il ​​controllo utente per fornire una separazione del codice.

Altri suggerimenti

Il tuo controllo non ha bisogno di sapere da dove provengono i dati. Non ha bisogno di conoscere la procedura memorizzata o altro. Tutto quello che deve sapere sono i dati che deve mostrare. Se capisco bene il tuo controllo, è una griglia con alcuni filtri di data. Riceverà i dati, li mostrerà e li filtrerà per data. Va bene, tutto ciò che deve sapere sono i dati che deve mostrare e e forse una data di inizio e fine predefinita dal genitore.

Ti stai perdendo il vero potere dei controlli utente se non gli permetti di comunicare con il suo genitore. Penso che potresti portare l'incapsulamento un po 'troppo in questo caso.

Supponi di avere un controllo utente che è solo una tabella o una griglia di vari dati utente. Inevitabilmente quel controllo utente dovrà conoscere l'identificatore univoco dell'utente per estrarre i suoi dati da qualsiasi luogo, il che ovviamente ti costringe a creare una proprietà pubblica che la pagina principale può impostare.

Inoltre, tieni presente che ci saranno momenti in cui un'azione all'interno di un controllo utente deve attivare un'azione sul genitore. I delegati agli eventi entrano in gioco qui e sono estremamente utili e, secondo me, rendono i controlli utente ancora più utili.

Lascia cadere l'intera idea sui controlli utente e sui genitori che non parlano avanti e indietro e troverai le cose molto più facili.

Quindi ci sono alcune cose all'interno di questo controllo utente che verranno associate a un set di dati restituito dalla procedura memorizzata?

Ecco un modo per gestirlo: Invece di provare a comunicare la procedura memorizzata al controllo utente, crea il set di dati che il controllo utente farà affidamento su una proprietà pubblica del controllo utente.

In fase di esecuzione, il codice al di fuori del controllo utente eseguirà la procedura memorizzata appropriata e imposterà la proprietà del set di dati sul controllo utente sul risultato restituito dal processo memorizzato.

Come hanno sottolineato tutti gli altri, il tuo controllo utente deve avere un modo standard di comunicare le sue intenzioni e comportamenti. Ciò non significa che devi avere un riferimento al contenitore e quindi sapere cosa (MyPage.aspx) lo contiene effettivamente.

La cosa che ho trovato indispensabile mentre lavoravo con i controlli utente sono gli eventi. Scopri gli eventi e come usarli. Gli eventi sono un ottimo modo per comunicare il comportamento.

Nel tuo esempio, potrei dividere i tuoi criteri (caselle di testo della data) nel suo controllo utente. Crea una nuova classe che eredita da EventArgs, che contiene i tuoi criteri (DateTime campi). Quando l'utente fa clic su Cerca, attiva un evento (di tipo EventHandler<YourEventArgs>) con il tuo EventArgs personalizzato. La pagina gestirà l'evento, interrogherà il database e quindi passerà i risultati in un metodo pubblico o interno sul tuo secondo controllo utente, che visualizza i record.

La chiave qui, il controllo dei criteri può essere riutilizzato su pagine diverse se è necessario chiamare diverse procedure memorizzate. Pensa agli scenari insert vs update. Spesso, gli elementi dell'interfaccia utente sono gli stessi. È possibile creare un controllo e utilizzarlo su due pagine diverse con due comportamenti diversi (AddRecord.aspx e UpdateRecord.aspx). Inoltre, il controllo che visualizza i record viene riutilizzato molto facilmente.

Un enorme vantaggio è che le tue pagine e i controlli diventano piuttosto piccoli. Ogni controllo / pagina riguarda davvero solo il suo piccolo sottoinsieme di funzionalità. Il tuo codice diventerà meno scoraggiante e più facile da mantenere.

  &

quot; quot dire &; l'utente controlla quale procedura memorizzata mi piacerebbe eseguire

Sembra che tu stia cercando eventi / delegati
Chiedi al controllo di esporre un evento e consenti al genitore di aggiungere un gestore (forse nel costruttore, se vuoi forzarlo ad aggiungere un solo evento)
In alternativa, è possibile utilizzare il modello Comando / Strategia: fare in modo che il genitore incapsuli il metodo e inviare l'oggetto incapsulante al controllo nel suo costruttore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top