Uno sguardo a ASP.NET Dynamic Data – parte 2
Nel primo post di questa serie abbiamo visto come realizzare una prima applicazione con ASP.NET Dynamic Data (DD). Come dicevo i DD sono pensati per scenari di rapida prototipazione, dove con poco realizziamo un sito completo partendo dalla basedati. Ci tengono a ricordare che questa è solo una possibilità in più, non in meno, possiamo naturalmente partire da zero usando WebForms o, quando sarà rilasciato, ASP.NET MVC e in base ai gusti scrivere più o meno codice oppure optare per un modello piuttosto che per l’altro.
Nonostante siano pensati per scenari RAD, però, i DD danno una buona possibilità di personalizzazione: in questo post vedremo come:
- Esporre solo alcune tabelle
- Visualizzare o meno le colonne delle tabelle esposte
- Personalizzare il comportamento di visualizzazione delle colonne
Quali tabelle esporre
Usando l’attributo scaffoldAllTables nel global.asax abbiamo infatti esposto tutte le tabelle del nostro db. Potremmo, invece, operare selettivamente impostando a false tale attributo e andando a abilitare la/le singole tabelle. Per ogni tabella su db, LINQ to SQL, ha creato una classe partial, che possiamo vedere nel codice del file .dbml. Vediamo ora proprio come estendere queste classi, aggiungiamo un nuovo file Order.cs , che definisce una nuova classe parziale con qualche attributo in più, come mostrato nel seguito:
Il nuovo namespace System.ComponentModel.DataAnnotation consente di usare l’attributo ScaffoldTalble, con cui possiamo rendere o meno visibile la tabella ai DD. Quindi nel nostro caso abbiamo impostato l’attributo scaffoldAllTables in global.asax a false, mentre abbiamo impostato per la classe Order (e anche Product ) l’attributo ScaffoldTable a true. Se lanciamo l’applicazione ora vedremo “scovate” dai DD due tabelle, come in figura:
Controllare le colonne che vengono esposte
Se andiamo a vedere le colonne della tabella Orders, cliccando sul link, notiamo che sono presenti tutte le colonne definite nella tabella, nella figura vedete evidenziata anche la colonna shippedDate, che andremo a modificare nel seguito:
Se per qualche ragione non volessimo visualizzarla, ecco che possiamo operare sempre sulla classe parziale precedentemente definita, aggiungendo un attributo ScaffoldColumn, dal comportamento intuitivo, come mostrato in figura:
Questa volta abbiamo dovuto scrivere un po’ di codice in più (bene :-)), definire un MetadataType, una classe nella quale poi definiamo un po’ il comportamento relativo alla colonna ShippedDate. Il comportamento, a meno di errori :-), è quello atteso: se lanciamo il sito e andiamo nella tabella Order, non vederemo più la colonnaShippedDate, l’attributo in questione, infatti, ha detto ai DD di non visualizzarlo più. Ometto l’immagine, potete immaginare …
Controlliamo il comportamento delle colonne
Il comportamento in fase di visualizzazione e modifica dei singoli campi della tabella è definito, come abbiamo visto nel primo post, dai template che si trovano nella directory DynamicData\FieldTemplate, dove trovate come viene visualizzato ogni campo di uno specifico tipo: guardate ad esempio il codice di Boolean.ascx e Boolean_Edit.ascx. Ora, se volessi modificare come vengono visualizzati i campi di uno specifico tipo di tutte le tabelle potrei modificare questi template, ma se volessi operare solo sul singolo campo (ShippedDate ad esempio) di una specifica tabella (Orders) potrei (come ho fatto) sfruttare alcuni meccanismi di estendibilità offerti dai DD. Guardate il pezzo di codice qui di seguito:
In questo caso sto usando l’attributo DisplayFormat per definire il formato di come deve essere visualizzato il campo in questione (la ShippedDate), in questo caso è una data che verrà visualizzata nel formato mostrato in figura. Inoltre grazie all’attributo UIHint sto indicando ai DD di non usare il template di default per il rendering dell’attributo, ma ho creato un nuovo field template che utilizza il controllo Calendar dell’ AJAX Control Toolkit. Non vi mostro il codice che ho usato per la personalizzazione del controllo, che non è molto, lo sto finendo di preparare per la sessione dei Microsoft Days 08. Il risultato visualizzato è il seguente:
Dove si nota il calendar in fase di editing della colonna ShippedDate.
Conclusione
In questo post avete visto come utilizzare alcune tecniche per personalizzare il comportamento di default dei DD, potendo non solo abilitare\disabilitare specifiche tabelle “scovate” dal runtime, ma anche personalizzando il singolo comportamento di un singolo campo di una specifica tabella, aprendo di fatto a molteplici utilizzi. I DD sono, in oltre, già compatibili con ASP.NET AJAX e anche con l’AJAX Control Toolkit, non ultimo potreste anche voler utilizzare controlli di terze parti per specifiche esigenze…. insomma non male, vero?
Comments
Anonymous
September 25, 2008
PingBack from http://informationsfunnywallpaper.cn/?p=6995Anonymous
October 14, 2008
Ecco, questo era proprio un post che mi serviva! Avrei però una domanda: io ho una tabella con una serie di colonne che all'atto della visualizzazione vorrei nascondere...però non voglio che vengano nascoste anche nella pagina di edit! come posso fare?Anonymous
October 15, 2008
Ciao Luca, intendi nascondere solo le colonne, alcune intendi? Nascondendo la tabella non avresti modo di raggiungere dalla UI la pagina per l'edit. Ho capito bene la tua domanda ?Anonymous
October 15, 2008
Ciao Luca, intendi nascondere solo le colonne, alcune intendi? Nascondendo la tabella non avresti modo di raggiungere dalla UI la pagina per l'edit. Ho capito bene la tua domanda ?Anonymous
October 15, 2008
Si, cmq mi spiego meglio: ho una tabella che contiene i dati anagrafici dei collaboratori di un'azienda. I campi sono tantissimi, e alcuni non è necessario che siano resi visibili. Per cui, nella pagina List.aspx che visualizza la lista di tutti i record, vorrei nascondere alcune colonne. Colonne che però non vorrei perdere del tutto e che vorrei visualizzare nella pagina per l'edit. C'è un modo quindi per nascondere queste colonne in maniera, diciamo, temporanea?Anonymous
October 15, 2008
The comment has been removedAnonymous
November 05, 2008
Non riesco a far funzionare lo scaffoldtable su tabelle singole in vb.net... la partial class che definisco deve avere lo stesso nome di quella del file vb generato da linq, no? Ho definito le tabelle come visibile tramite l'attributo <ScaffoldTable(True)> ma mi dice comunque che non ho tabelle visibili... boh!Anonymous
November 05, 2008
guarda se il datacontext è registrato correttamente ed è quello giustoAnonymous
November 05, 2008
Riesco a modificare la visibilità con vb.net solo in senso "negativo", ovvero impostando lo scaffold per tutte le tabelle a True nel Global.asax e poi limitandole con le classi parziali... non mi pare troppo corretto :P dove sbaglioooo :D Ah, complimenti Pietro: ho seguito il tuo recente intervento a Torino e sei stato molto bravo... lo dice uno che da sempre odia i wizard che mi levano il lavoro :DAnonymous
November 05, 2008
Ciao, non ho ben capito ... madami una mial con l'esempio, che forse è più chiaro.Anonymous
November 07, 2008
Va bene... appena ho due minuti ti scrivo :) grazie per la disponibilità!!Anonymous
November 10, 2008
Ciao Pietro, innanzitutto complimenti per la sessione che hai tenuto a Padova il mese scorso! Ho appena fatto il mio primo test con Dynamic Data, ma l'edit ed il detail vanno in errore, immagino sia perchè gli ID di alcune tabelle sono dei char(1) anziché degli interi. Mi viene restituito il seguente errore: "Operatore '==' incompatibile con i tipi di operandi 'Char' e 'String'" Come posso risolvere il problema?Anonymous
November 14, 2008
Penso ti convenga aggiungere della logica custom di validazione usando alcuni dei metodi aprziali messi a disposizione dalle classi generate da linq2sql o Ef.Anonymous
March 30, 2010
Ciao, io ho un problema di questo tipo, ho una list.aspx che mi espone i dati di una tabella (Categorie: ID | Nome) List visualizza Nome. Ho un campo testo di filtro sul nome con AutoComplete, cerco la categoria per nome (aaaTest01 per esempio) e list mostra solo la categoria filtrata. Entro in Edit e mi porto dietro nella querystring l'ID e il nome (edit.aspx?ID=1&Nome=aaaTest01). Quando clicco su Update o Cancel nell'edit io vorrei che tornasse indietro e mantenesse il filtro sul nome che ho impostato, ma la pagina mi va in errore su AutoComplete perchè in InitialValue ho solo "aaaTest01" e autocomplete filtra per var whereCall = BuildItemsQuery(query, metaTable, metaTable.PrimaryKeyColumns, primaryKeyValues); Come posso risolvere questo problema?