Controlli DataSource in ASP.NET 2.0

3 pagine in totale: <<Indietro 1 [2] 3 Avanti >>

Implementazioni

In precedenza abbiamo visto come usare il controllo SqlDataSource con un semplice esempio. Il controllo ha numerose proprietà per definire le query di CRUD Select/Delete/Insert/UpdateCommand e per ognuna di esse è possibile dichiarare una collezione xxxParameters per indicare una serie di parametri da utilizzare all'interno delle query. La classe Parameter è un tipo base e le classi che derivano da essa ci permettono di ottenere valori da qualsiasi oggetto senza dover ricorre al codice. I parametri che possiamo utilizzare sono i seguenti:

  • QueryStringParameter: preleva in funzione della proprietà QueryStringName da Context.Request.QueyString;
  • FormParameter: preleva in funzione della proprietà FormField da Context.Request.Form;
  • CookieParameter: preleva in funzione della proprietà CookieName da Context.Request.Cookies;
  • SessionParameter: preleva dall'oggetto Session in funzione della chiave SessionField;
  • ControlParameter: cerca il controllo specificato tramite la proprietà ControlID e ne preleva la proprietà specificata tramite ControlName. Se quest'ultima viene omessa, verifica che la classe sia marcata con l'attributo ControlValuePropertyAttribute che indica il nome della proprietà di default che ne rappresenta il valore. Per esempio per una TextBox la proprietà predefinita è Text.

Il controllo SqlDataSource sa lavorare in due modalità impostando la proprietà SqlDataSourceMode o su DataReader o su DataSet. La prima è la più performante, ma non supporta le funzionalità di ordinamento, filtro e paginazione. La seconda invece riempie un DataSet intermedio che offre tutte le funzionalità che il DataReader non offre.

Al fine di limitare le query su database, il controllo dispone di un meccanismo di caching che è attivabile/disattivabile attraverso le proprietà EnableCaching. Esistono inoltre le proprietà CacheDuration per indicare una durata, CacheExpirationPolicy per specificare se la scadenza è ad una data esatta o in sliding rispetto al suo ultimo utilizzo, CacheKeyDependency per dare una chiave personalizzata e SqlCacheDependency per sfruttare il motore di dependency su database SQL Server 2000/2005.

Nel controllo sono presenti eventi pre e post operazione (Deleted/Deleting, Selected/Selecting, Updated/Updating, Inserted/Inserting) ed è possibile tramite l'argomento intervenire sul DBCommand che sta per essere eseguito, conoscere l'eccezione generata o il numero dei record coinvolti nella query.

ObjectDataSource: caricare i dati da custom entities

Un DataSource molto simile come utilizzo è l'ObjectDataSource. Anch'esso dispone dei meccanismi di caching (ad eccezione di SqlCacheDependency) e di eventi per ogni operazione. Dal momento che utilizza una classe come sorgente, è necessario specificare tramite la proprietà TypeName il Fully Qualified Name della classe (namespace.classe, assembly). Ogni volta che viene invocato uno dei metodi CRUD, viene automaticamente creata un'istanza. Il nostro tipo deve quindi avere un costruttore di default, senza parametri. In caso contrario possiamo intercettare l'evento ObjectCreating e valorizzare la proprietà ObjectInstance dell'argomento così da poter creare manualmente l'istanza ed avere il massimo della libertà.

Nel caso dell'ObjectDataSource, al posto delle query SQL, indichiamo il nome dei metodi della classe custom da chiamare tramite Select/Insert/Delete/UpdateMethod, passando i rispettivi parametri xxxParameters come per il SqlDataSource. I nostri metodi Insert/Delete/Update possono facoltativamente restituire un intero indicante il numero delle righe coinvolte nell'operazione, mentre Select deve restituire almeno un IEnumerable. Non è peraltro possibile sfruttare la possibilità di filtro, ordinamento e/o paginazione. Per far ciò occorre restituire un ICollection così da poter contare il numero dei record oppure un oggetto DataSet/DataTable/DataView per ordinare e filtrare in modo automatico. In alternativa è possibile specificare tramite la proprietà SortParameterName il nome dell'argomento da passare alla funzione Select. Spetta comunque allo sviluppatore implementare l'ordinamento. Per la paginazione invece è possibile specificare MaximumRowsParameterName e StartRowIndexParameterName che rappresentano gli argomenti che vengono passati alla funzione Select.

XmlDataSource per i file XML

Tra gli HierarchicalDataSourceControl troviamo innanzitutto XmlDataSource. Il controllo è in grado di caricare file o sorgenti XML, specificando la proprietà DataFile o inserendo l'XML direttamente nella pagina ASPX tramite la proprietà Data.

Ecco un esempio:

<asp:XmlDataSource ID="xmlSource" runat="server">
    <Data>
        <items xmlns="">
            <item>item1</item>
            <item>item2</item>
            <item>item3</item>
        </items>
    </Data>
</asp:XmlDataSource>

La sorgente XML può essere sottoposta ad una trasformazione XSLT. Le proprietà Transform e TransformFile ci permettono di inserire direttamente la trasformazione XSLT o di indicare un file XSLT; l'operazione è intercettabile tramite l'evento Transforming. Con il metodo Save è possibile, se è stato specificato il DataFile, risalvare l'XML poiché XmlDataSource implementa IDataSource ed è quindi modificabile.

SiteMapDataSource

Della stessa famiglia è l'oggetto SiteMapDataSource che utilizza un SiteMapProvider per restituire la mappa di un sito. In ASP.NET 2.0 è possibile fornire uno o più provider che implementano un tipo base conosciuto al SiteMapDataSource e che può variare a seconda che questo prelevi la struttura da un file XML con un certo schema, da database o da qualsiasi altra fonte. Questi provider si specificano nel web.config tramite la sezione system.web/siteMap/providers e sono identificabili per nome. Il controllo SiteMapDataSource tramite la proprietà SiteMapProvider permette di specificare quale provider viene utilizzato. In caso di omissione viene utilizzato il provider di default. In alternativa è possibile specificare il provider tramite la proprietà Provider. Come funziona un provider e come implementarne uno sono argomenti che vanno oltre lo scopo di questo articolo.

Implementazione custom

Ora che abbiamo visto come funzionano le varie implementazioni dei controlli DataSource, proviamo a costruirne uno in grado di mostrare e cancellare i files presenti in una directory. Creiamo una classe di nome DirectoryDataSource che eredita da DataSourceControl e dotiamola di una proprietà Directory per indicare quale directory deve caricare.

public class DirectoryDataSource : DataSourceControl
{
    public string Directory
    {
        get
        {
            object o = ViewState["Directory"];
            if (o == null)
                return String.Empty;
            return o.ToString();
        }
        set
        {
             ViewState["Directory"] = value;
        }
    }
}

3 pagine in totale: <<Indietro 1 [2] 3 Avanti >>

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.


TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC