Sei sulla pagina 1di 151

SVILUPPARE UN SITO WEB ASP.

NET
Tutorial pratico

Domenico De Cerbo 2008/2009


domenico@decerbo.it
I contenuti del presente Tutorial possono essere utilizzati liberamente, con lobbligo della citazione dellautore

Note Il tutorial sviluppato nel Visual Web Developer (VWD) di Visual Studio 2008 Express Edition, con .NET Framework 3.5 (che ha lo stesso motore della versione 2.0); gli assembly sono sviluppati con Visual Studio 2005 Standard Edition. Se si lavora con con versioni di .NET Framework precedenti alla versione 2.0 alcuni elementi di codice dovranno essere modificati. Si presuppone la conoscenza quanto meno degli elementi di base di (X)HTML e CCS, che qui verranno utilizzati senza fornire spiegazioni, in quanto il Tutorial incentrato su ASP.Net 2; in internet si possono reperire numerose guide e risorse su questi argomenti, se ne indicano alcune: http://xhtml.html.it/ http://www.morpheusweb.it/html/manual i/css.asp http://css.html.it/ http://www.webmasterpoint.org/webdesi http://aspnet.html.it/ gn/css/home.asp http://www.web-link.it/ http://www.morpheusweb.it/html/manual i/xhtml.asp Per quanto riguarda le tecnologie ASP.Net le fonti principali ed al contempo pi attendibili (cui per lAppendice si fatto abbondante ricorso) sono: http://msdn.microsoft.com/it-it/asp.net/default.aspx http://quickstarts.asp.net/QuickStartv20/aspnet/ (in lingua inglese) http://www.aspitalia.com/ Sullinstallazione e configurazione dei provider per Microsoft Access in luogo di quelli predefiniti per SQL Server consultare il seguente articolo, molto esaustivo: http://imar.spaanjaars.com/QuickDocId.aspx?quickdoc=404 (in lingua inglese) I risultati che si perseguiranno attraverso molte delle procedure mostrate potrebbero essere ottenuti anche pi rapidamente cambiando lordine delle operazioni ed avvalendosi maggiormente degli automatismi messi a disposizione da VWD: si per ritenuto di seguire procedure pi lunghe e con ampi interventi manuali, in modo da consentire una maggiore comprensione dei meccanismi che stanno a fondamento dellinterazione fra i singoli oggetti, e con ci fornire al lettore gli strumenti di base per andare oltre a quanto forma oggetto del presente Tutorial. In Appendice sono riportati tutti i listati, sia dei form web che dei codici sottostanti, cui far riferimento durante la lettura.

S OM M ARI O
SOMMARIO ....................................................................................................................... 3 INTRODUZIONE .................................................................................................................. 7 SVILUPPO ......................................................................................................................... 7 1. CREAZIONE DI UN SITO DENOMINATO SITOPROVE IN VISUAL W EB DEVELOPER (VWD) DI VISUAL STUDIO 2008 EXPRESS EDITION ................................................................................................................... 7 Operazione preliminare: progettazione del sito ........................................................................ 7 Creazione del sito ............................................................................................................ 8 2. CONFIGURAZIONE DELLA APPLICAZIONE ASP.NET SITOPROVE IN IIS 7.0 ...................................... 11 3. IMPOSTARE LE RISORSE PRINCIPALI ................................................................................. 13 4. IMPOSTAZIONE DELLA SICUREZZA ................................................................................... 14 Installazione e configurazione dei provider per MS Access ......................................................... 14
Esame ed integrazione del database ASPNetDB.mdb di MS Access ....................................................... 17 Inserimento di Ruoli ed Utenti ........................................................................................................ 21 Memo Password ..................................................................................................................... 22 Definizione delle Regole di Accesso ................................................................................................ 23 web.config della root del sito ..................................................................................................... 23 web.config della cartella /private .............................................................................................. 23 web.config della cartella /admin ............................................................................................... 23

AREA PUBBLICA ....................................................................................................... 24 Default.aspx: la home page ............................................................................................. 24 2. AREA AMMINISTRATORE .............................................................................................. 26 amministra.aspx: la home page dellarea amministrazione ........................................................ 26 1.
Menu di navigazione ................................................................................................................ 26 Controllo Calendario ................................................................................................................ 28 Prospetto Iscritti abilitati allaccesso ............................................................................................. 30

Autorizzazioni.aspx e Pannello.aspx: le pagine per la gestione degli Iscritti .................................. 34


Autorizzazioni.aspx .................................................................................................................... 34 Registrazione utente Informazioni di base .................................................................................... 34 Registrazione utente Attribuzione ad un Ruolo .............................................................................. 36 Registrazione utente Informazioni aggiuntive ................................................................................ 37 Creazione di un nuovo Ruolo / Eliminazione di un ruolo esistente ......................................................... 40 Pannello.aspx ........................................................................................................................... 41 Sezione Modifica dati Utenti ....................................................................................................... 41 Sezione Eliminazione Utenti ....................................................................................................... 46 Sezione Modifica assegnazione ruoli ............................................................................................ 47

3. AREA ISCRITTI ......................................................................................................... 50 CREARE LA PAGINA MASTER ................................................................................................. 51 Inseriamo il menu .......................................................................................................... 52 LE PAGINE DEI CONTENUTI (.ASPX) ........................................................................................... 53 Pagine a tre colonne....................................................................................................... 53 Pagine a due colonne ..................................................................................................... 54
Gestione di documenti Excel ......................................................................................................... 54 Creazione del documento Excel .................................................................................................. 54 Visualizzazione del documento completo ....................................................................................... 55 Visualizzazione di dati estratti dal documento .................................................................................. 56 Collegamenti a documenti Word .................................................................................................... 58

CONCLUSIONE ................................................................................................................ 59 APPENDICI DI RIFERIMENTO .............................................................................................. 60 I File *.Config ............................................................................................................ 60 Path relative .............................................................................................................. 60
In (X)HTML ........................................................................................................................... 60 In ASP.Net ............................................................................................................................ 60 Percorso assoluto ................................................................................................................... 61

SVILUPPARE UN SITO WEB ASP.NET

Altre soluzioni ........................................................................................................................ 61

Operazioni su file e Stringhe Esempi........................................................................... 61


Conta ..................................................................................................................................... 61 Elenca File .............................................................................................................................. 61 Elenca cartelle di sistema ............................................................................................................ 61 Estrae parte di una stringa ........................................................................................................... 61

Connessioni a Database e fonti esterne ......................................................................... 62


Stringhe di connessione .............................................................................................................. 62 MS Access ........................................................................................................................... 62 SQL Server ........................................................................................................................... 62 mySQL ................................................................................................................................ 62 Excel................................................................................................................................... 63 Oggetto connessione .................................................................................................................. 63 Classe OleDbConnection .......................................................................................................... 63 Definizione dei dati da elaborare .................................................................................................... 65 Metodo di elaborazione classe OleDbCommand .............................................................................. 65 Costruttori ............................................................................................................................ 65 Metodi (pi frequenti) ............................................................................................................... 65 Propriet (pi frequenti) ............................................................................................................ 66

Pagine Master .......................................................................................................... 68


Pagina Master ....................................................................................................................... 68 Pagina Content ...................................................................................................................... 68 Master annidati ...................................................................................................................... 69

Tipi di Controlli ........................................................................................................ 70


HTML Controls ....................................................................................................................... 70 Server Controls ...................................................................................................................... 70 Espressioni utilizzate nel sito: ..................................................................................................... 76 Esempi trovati in Internet .......................................................................................................... 77 User Controls ........................................................................................................................ 78

Direttiva @Master ....................................................................................................... 78


Attributi ................................................................................................................................... 78 AutoEventWireup ................................................................................................................ 78 ClassName .......................................................................................................................... 78 CodeFile ............................................................................................................................ 78 CompilationMode ................................................................................................................ 79 CompilerOptions ................................................................................................................ 79 Debug ................................................................................................................................. 79 Description ....................................................................................................................... 79 EnableTheming .................................................................................................................... 79 EnableViewState ................................................................................................................ 79 Explicit ............................................................................................................................ 79 Inherits ............................................................................................................................ 79 Language ............................................................................................................................ 79 LinePragmas ....................................................................................................................... 79 MasterPageFile .................................................................................................................. 79 Src .................................................................................................................................... 79 Strict ............................................................................................................................... 79 WarningLevel ..................................................................................................................... 80

Direttiva @Page .......................................................................................................... 80


Attributi ................................................................................................................................... 80 Async ................................................................................................................................. 80 AsyncTimeOut ..................................................................................................................... 80 AspCompat .......................................................................................................................... 80 AutoEventWireup ................................................................................................................ 80 Buffer ............................................................................................................................... 80 ClassName .......................................................................................................................... 80 ClientTarget ..................................................................................................................... 81 CodeBehind ......................................................................................................................... 81 CodeFile ............................................................................................................................ 81 CodeFileBaseClass ............................................................................................................. 81 CodePage ............................................................................................................................ 81 CompilationMode ................................................................................................................ 81
sabato 6 luglio 2013 Pag. 4 / 151

SVILUPPARE UN SITO WEB ASP.NET

CompilerOptions................................................................................................................. 81 ContentType ....................................................................................................................... 81 Culture .............................................................................................................................. 81 Debug ................................................................................................................................. 82 Description ....................................................................................................................... 82 EnableEventValidation....................................................................................................... 82 EnableSessionState............................................................................................................ 82 EnableTheming .................................................................................................................... 82 EnableViewState................................................................................................................. 82 EnableViewStateMac............................................................................................................ 82 ErrorPage........................................................................................................................... 82 Explicit ............................................................................................................................ 83 Inherits ............................................................................................................................ 83 Language ............................................................................................................................ 83 LCID ................................................................................................................................... 83 LinePragmas ....................................................................................................................... 83 MaintainScrollPositionOnPostback .................................................................................... 83 MasterPageFile .................................................................................................................. 83 ResponseEncoding ............................................................................................................... 84 SmartNavigation................................................................................................................. 84 Src..................................................................................................................................... 84 Strict................................................................................................................................ 84 StyleSheetTheme................................................................................................................. 84 TargetSchema...................................................................................................................... 84 Theme ................................................................................................................................. 84 Title ................................................................................................................................. 84 Trace ................................................................................................................................. 84 TraceMode........................................................................................................................... 85 Transaction ....................................................................................................................... 85 UICulture........................................................................................................................... 85 ValidateRequest................................................................................................................. 85 ViewStateEncryptionMode ................................................................................................... 85 WarningLevel...................................................................................................................... 85

Propriet AutoPostback ................................................................................................ 85


Postback ................................................................................................................................. 85 Viewstate ................................................................................................................................ 86 AutoPostBack ........................................................................................................................... 86 IsPostBack .............................................................................................................................. 87

Controllo ContentPlaceHolder .................................................................................... 87 Controllo ContentPlaceHolderID ................................................................................. 87 Controllo Calendar....................................................................................................... 87 Controllo Literal .......................................................................................................... 87 Controllo AccessDataSource ......................................................................................... 87 Controllo GridView ..................................................................................................... 89 Controllo DetailsView ................................................................................................ 90 Controllo MultiView ................................................................................................... 90 Controllo LoginView .................................................................................................. 90 Oggetto ObjectDataSource ......................................................................................... 91 Classe TemplateField ................................................................................................ 91 Classe CommandField .................................................................................................. 91 Classe Content .......................................................................................................... 91 Classe Menu ................................................................................................................ 91 Classe SiteMapPath .................................................................................................... 92 Classe Membership ...................................................................................................... 92
Metodi .................................................................................................................................... 92 Propriet ................................................................................................................................. 93 Eventi..................................................................................................................................... 94

Classe MembershipUser ................................................................................................ 94


Costruttori ............................................................................................................................... 94
sabato 6 luglio 2013 Pag. 5 / 151

SVILUPPARE UN SITO WEB ASP.NET

Costruttore MembershipUser (String, String, Object, String, String, String, Boolean, Boolean, DateTime, DateTime, DateTime, DateTime, DateTime) ..................................................................................................... 94 Metodi .................................................................................................................................... 95 Propriet ................................................................................................................................. 95

Classe MembershipCreateStatus ..................................................................................... 96


Membri ................................................................................................................................... 96

Classe MembershipCreateUserException .......................................................................... 96 Classe StatusCode ....................................................................................................... 97


Esempi ................................................................................................................................... 97

Classe Roles.............................................................................................................. 102


Metodi .................................................................................................................................. 102 Propriet ............................................................................................................................... 103

LISTATI ........................................................................................................................ 104 web.config.................................................................................................................. 104 webAdmin.sitemap ....................................................................................................... 105 webIscritti.sitemap ........................................................................................................ 106 fissi.css ..................................................................................................................... 106 Default.aspx ............................................................................................................... 108 Default.aspx.vb ............................................................................................................ 110 admin\web.config ......................................................................................................... 110 admin\admin.css .......................................................................................................... 110 admin\amministra.aspx .................................................................................................. 112 admin\amministra.aspx.vb ............................................................................................... 116 admin\autorizzazioni.aspx ............................................................................................... 118 admin\autorizzazioni.aspx.vb ........................................................................................... 126 admin\pannello.aspx ..................................................................................................... 129 admin\pannello.aspx.vb .................................................................................................. 137 private\web.config ........................................................................................................ 140 private\base.css ........................................................................................................... 141 private\Prim_Iscritti.master .............................................................................................. 143 private\Prim_Iscritti.master.vb .......................................................................................... 144 private\iscritti_home.aspx................................................................................................ 144 private\iscritti_home.aspx.vb ............................................................................................ 145 private\Pag1.aspx......................................................................................................... 145 private\Pag1.aspx.vb ..................................................................................................... 145 private\PagExcel.aspx ................................................................................................... 145 private\PagExcel.aspx.vb ................................................................................................ 147 private\PagWord.aspx ................................................................................................... 149 private\PagWord.aspx.vb ................................................................................................ 150

sabato 6 luglio 2013 Pag. 6 / 151

SVILUPPARE UN SITO WEB ASP.NET

I NT RODUZI ONE
Lobiettivo che ci siamo posto consiste nel realizzare in ASP.Net un sito completo abbastanza semplice, ma perfettamente funzionale, che cos com pu essere utilizzato per siti personali o di piccole realt, come associazioni, condomini etc. Questo tutorial non si rivolge agli sviluppatori esperti, ma a coloro che, come me, si impegnano allo sviluppo di un sito quando ne abbiano unesigenza specifica, e quindi si trovano a dover ris olvere problema per problema con affannose ricerche, attraverso le quali il pi delle volte ottengono risultati abbastanza criptici per lo sviluppatore neofita od occasionale. Pertanto lapproccio essenzialmente pratico: nel contesto vengono spiegati sommariamente, ma [spero] in modo abbastanza chiarificatore i singoli passi, mentre per gli approfondimenti si rimanda allAppendice o a link su Internet.

S V I LUP P O 1. C REAZIONE DI UN SITO DENOMINATO S ITO P ROVE DI V ISUAL S TUDIO 2008 E XPRESS E DITION
OPERAZIONE PRELIMINARE: PROGETTAZIONE DEL SITO
Prevediamo per (quasi) tutte le pagine del sito un layout simile al seguente:

IN

V ISUAL W EB D EVELOPER (VWD)

Tutte le aree verranno impostate con elementi <div> in base a codice CSS sottostante (file fissi.css, situato nella directory principale del sito, admin.css nella cartella /admin e base.css, nella cartella /private). Il sito dovr avere: una pagina iniziale, Default.aspx, pubblica, nella root tre pagine riservate allAmministratore di sistema, amministra.aspx, autorizzazioni.aspx e pannello.aspx, nella cartella /admin
sabato 6 luglio 2013 Pag. 7 / 151

SVILUPPARE UN SITO WEB ASP.NET

diverse pagine di contenuti riservati agli iscritti, nella cartella /private, di cui la prima denominata

iscritti_home.aspx
Saranno inoltre create altri oggetti in relazione alle esigenze ed alle fasi dello sviluppo. La pagina pubblica e quelle dellAmministratore avranno layout specifici, pur in linea di massima rispondenti a quello dello schema di cui sopra; tutte le pagine dellarea deg li iscritti avranno un identico layout definito attraverso coppie di pagine master/content (per il concetto di pagine master vedere in seguito a pag.68), organizzate come segue: Intestazione1 con il nome del sito ed un logo, ed una sottointestazione Intestazione2 con una barra di menu CorpoSx, CorpoCentro, CorpoDx con i contenuti specifici delle singole pagine Piede con contenuti comuni a tutte le pagine

CREAZIONE DEL SITO


1. Dal menu File di Visual Web Developer (VWD per il seguito) scegliamo New Web Site. Appare la seguente schermata:

Nel riquadro Modelli selezioniamo ASP.NET Web Site. In Percorso selezioniamo File system: in tal modo la cartella con tutti i files del sito verr salvata in un percorso locale; successivamente con IIS si far in modo che il sito possa essere testato in locale nel browser anche al di fuori dellambiente VWD (v. pag.11). Nella casella adiacente immettiamo il percorso locale in cui i files del progetto dovranno essere salvati: F:\Siti Web in elaborazione\SitoProve. Nella casella Linguaggio selezioniamo il linguaggio di programmazione che si intende utilizzare prevalentemente (in questo caso abbiamo scelto Visual Basic perch ha una sintassi pi verbosa ma anche pi autoesplicativa e maggiormente conosciuta di C#), tenendo presente che ASP.NET consente la coabitazione di pi linguaggi di programmazione, per cui per specifiche esigenze in qualunque punto del progetto si potranno introdurre routine in C#, Javascript, etc.

sabato 6 luglio 2013 Pag. 8 / 151

SVILUPPARE UN SITO WEB ASP.NET

2.

Scegliendo OK verr creato un nuovo progetto Web Form nella directory specificata:

Avendo selezionato File system si pu lavorare in locale e per il momento possibile testare il sito in costruzione solo con il web server interno (denominato Cassini 2) di VWD. Nel momento che imposta il sito, il programma crea anche la prima pagina (o web form), Default.aspx, che di default la home page, ed il file web.config (Appendice pag.60), che contiene le configurazioni specifiche del sito. Ogni pagina Web Form, in base allimpostazione predefinita che si chiama code-behind, che adottiamo, consiste di due file separati: Il file *.aspx, contenente il testo HTML e i controlli necessari per creare l'interfaccia utente della pagina. Un secondo file, *.aspx.vb (se invece di Visual Basic fosse stato scelto C# sarebbe stato *.aspx.cs) contenente il codice della pagina, ovvero il file di classe della pagina o file del codice sottostante.

Ci troviamo cos nell'ambiente di lavoro:

Nella parte destra, in alto, si trova il pannello Esplora Soluzioni che mostra tutti i file e le cartelle del sito. Come si vede, VWD ha aggiunto anche la cartella App_Data, che ha la caratteristica di consentire laccesso dalle pagine del sito che ne richiamano i dati, ma non non raggiungibile via browser; deputata ad ospitare i file dei database SQL (peraltro in questo progetto noi utilizzeremo un database MS Access, per il quale in seguito creeremo una cartella specifica) ed anche altri file dati (*.txt etc). Nel pannello centrale si vede la Default.aspx aperta in modalit Origine: con le linguette in basso possiamo passare alla modalit Progettazione.

sabato 6 luglio 2013 Pag. 9 / 151

SVILUPPARE UN SITO WEB ASP.NET

Nella visualizzazione Progettazione il file viene visualizzato come WYSIWYG ed possibile trascinare i controlli e configurarli utilizzando la finestra degli strumenti, che si apre a scomparsa facendo click sulle linguette a sinistra. Nella visualizzazione Origine viene visualizzato il codice HTML della pagina.

Passando da una modalit all'altra, ogni visualizzazione viene aggiornata con le modifiche apportate. Codice generato automaticamente da VWD quando si aggiunge una pagina: <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> </div> </form> </body> </html> La prima riga una direttiva @Page (v. pag.80) che specifica: Language il linguaggio utilizzato (VB o C#) CodeFile il nome del file code-behind appartenente alla pagina (Default.aspx.vb) Inherits il nome della classe da cui ereditare (specificata allinterno dell.aspx.vb) AutoEventWireup, Indica se gli eventi della pagina vengono connessi automaticamente. True indica che attivata la connessione automatica degli eventi al caricamento della pagina gestito dal metodo Page_Load, con false invece occorre gestire gli eventi nel codice con la parola chiave handles. La disattivazione di questa propriet consente maggiore velocit di elaborazione, che per nel nostro caso, date le dimensioni, irrilevante, per cui in genere metteremo true nelle pagine che creeremo.

Il <!DOCTYPE dichiara il documento come XHTML 1.0 Transitional. La riga <html xmlns= indica un URI che identifica i nomi dei tag e degli attributi che possono essere utilizzati all'interno del documento XML. Gli attributi <head runat="server"> e <form id="form1" runat="server"> consentono al codice di elaborare in modalit server-side i tag HTML head e form. Lid, che sostituisce il vecchio attributo Html name, attribuisce al form un nome univoco per un eventuale richiamo da parte di altri elementi o del codice. 3. 4. Nel codice modifichiamo il nome del form, sostituendo <form id="form1" runat="server"> con <form id="pag_iniziale" runat="server"> Fra i tag <div> e </div> inseriamo un testo qualunque (p.e. Questa la pagina iniziale del sito) per poter fare il primo test. Infatti premendo Ctrl-F5 si apre il browser con la seguente schermata:

sabato 6 luglio 2013 Pag. 10 / 151

SVILUPPARE UN SITO WEB ASP.NET

2. C ONFIGURAZIONE

DELLA APPLICAZIONE

ASP.NET S ITO P ROVE

IN

IIS 7.0

Si presuppone che IIS (Internet Information Services) 7.0 sia gi installato nel computer con tutte le opzioni necessarie. Se installata una versione precedente, i concetti sono gli stessi, cambiano le procedure. 1. 2. 3. Chiudiamo VWD dopo aver salvato la pagina Default.aspx modificata. Dal menu Start di Windows facciamo click su Esegui. Nella casella Apri digitiamo inetmgr, quindi clicchiamo su OK. Si apre il pannello di Gestione di IIS. Nella finestra di sinistra espandiamo tutti i nodi del computer locale (nella figura Home-One): poich il SitoProve stato creato in una cartella di File system e non in C:\inetpub\wwwroot, non visualizzato in IIS.

4.

Per renderlo accessibile occorre creare una directory virtuale, che appare ai browser client come se fosse contenuta nella directory radice del server Web IIS, nonostante fisicamente si trovi in un percorso diverso. Con il pulsante destro del mouse facciamo click sul nodo Siti, si apre il seguente menu:

sabato 6 luglio 2013 Pag. 11 / 151

SVILUPPARE UN SITO WEB ASP.NET

5.

Selezionando Aggiungi Sito Web appare la finestra riprodotta nella figura seguente, in cui sono mostrate tutte le impostazioni che dobbiamo immettere:

importante selezionare un pool di applicazioni (nella specie DefaultAppPool) e scegliere il tipo di autenticazione: lasciando il valore predefinito pass-through IIS utilizza le credenziali dell'utente richiedente per laccesso al sito; altrimenti se vogliamo definire un utente abilitato, che si dovr connettere con proprio nome e password, occorre scegliere Connetti come. 6. Al termine delloperazione, dopo aver dato lOK, il sito (che gi fisicamente esisteva) stato aggiunto ad IIS come directory virtuale, come possiamo verificare selezionando nel pannello di sinistra il nodo Siti e facendo click nel pannello di destra sul tab Visualizza directory virtuali:

sabato 6 luglio 2013 Pag. 12 / 151

SVILUPPARE UN SITO WEB ASP.NET

7.

ora possibile fare il test di accesso. Chiudiamo IIS e VWD, apriamo il browser ed inseriamo lindirizzo http://localhost/: appare la prima pagina del sito, che prima era accessibile soltanto da VWD:

3. I MPOSTARE

LE RISORSE PRINCIPALI

A questo punto conviene creare subito tutte le cartelle che ci serviranno (dal pannello Esplora soluzioni di VWD ci posizioniamo sul nodo che dovr contenere la cartella e dal menu contestuale che si apre con il click destro del mouse scegliamo Nuova cartella):

(root)

/admin /mdb-database /cgi-bin /private /servizi /servizi/img

per contenere le pagine riservate allamministratore di sistema per contenere i database mdb (MS Access) sui quali possono leggere e scrivere pagine asp.net (presenta le stesse caratteristiche di sicurezza viste per App_Data) per i file assembly per contenere le cartelle e le pagine riservate agli utenti registrati per i file di documento (es. Word, Excel) e le immagini generiche di supporto per le immagini descrittive dei contenuti

Attenzione: le specifiche delle cartelle di sistema potrebbero variare in relazione allhosting su cui si dovr pubblicare il sito; pertanto, preferibilmente prima dello sviluppo, o comunque necessariamente prima della pubblicazione, verificare le specifiche del proprio servizio di hosting, ed eventualmente cambiare le cartelle (e conseguentemente cambiare i riferimenti). Successivamente creiamo in sequenza tutte le pagine web che prevediamo ci occorrano per il sito. Posizionandosi sulla cartella admin, dal menu Siti Web si avvia Aggiungi nuovo elemento e dalla finestra di dialogo che si apre selezioniamo il modello Web form, attribuiamo il nome amministra.aspx e, dopo aver selezionato Inserisci codice in file separato e deselezionato Seleziona pagina master, facciamo click su Aggiungi. Analogamente creiamo: in admin in private

pannello aspx, autorizzazioni.aspx iscritti_home.aspx, Pag1.aspx, Pag2.aspx, Pag5.aspx, PagExcel.aspx, PagWord.aspx

Pag3.aspx,

Pag4.aspx,

Lasciamo grezze (cos come impostate da VWD) tutte le pagine create: in questa fase ci serve soltanto averle a disposizione per i riferimenti che si dovranno stabilire durante lo sviluppo. Interverremo poi in ogni pagina per implementare tutto il codice.

sabato 6 luglio 2013 Pag. 13 / 151

SVILUPPARE UN SITO WEB ASP.NET

4. I MPOSTAZIONE

DELLA

S ICUREZZA

Anche se ad una prima occhiata sembra prematuro, occorre subito prendere una decisione sulle metodologie da scegliere per implementare la sicurezza del sito (autorizzazioni, autenticazioni), in quanto da questa scelta dipenderanno molte delle scelte che si dovranno effettuare in seguito. Innanzitutto, appare obbligato ricorrere alle funzionalit messe a disposizione da Asp.Net, che presentano un alto grado di affidabilit e consentono di fruire di controlli a ci deputati che consentono la gestione di Utenti, Ruoli, Profili senza scrivere alcuna riga di codice, attraverso le chiamate dirette ai provider dei database ed alle API di .Net. Asp.Net di default impostato per gestire gli accrediti (accesso dellamministratore di sistema e degli iscritti nelle rispettive aree riservate) con i database di SQL Server, e pertanto il sito appena creato gi potrebbe essere operativo. Per occorre tener conto dei servizi messi a disposizione dallhosting in cui il sito verr pubblicato. Nella maggior parte dei casi vengono offerte le seguenti possibilit: MS SQL Server MySql MS Access Per lo pi MS Access incluso nel pacchetto di base di mantenimento del dominio, mentre per gli altri spesso occorre pagare quote annuali aggiuntive. Pertanto in questo Tutorial, per quel motivo e perch la natura del sito proposto non richiede le pi elevate prestazioni degli altri database, abbiamo scelto di lavorare con Microsoft Access. Ci comporta che occorre sostituire i provider di SQL Server con quelli di Microsoft Access.

INSTALLAZIONE E CONFIGURAZIONE DEI PROVIDER PER MS ACCESS


Qui riportiamo solo i passaggi pratici per rendere operativa lapplicazione con un database Access: per approfondimenti si veda il link http://imar.spaanjaars.com/QuickDocId.aspx?quickdoc=404. 1. dal sito Microsoft http://msdn.microsoft.com/en-us/asp.net/aa336558.aspx scaricare il file

SampleAccessProviders.vsi, ed installarlo facendoci doppio click e seguendo le istruzioni: se


appare un avviso di alert, procedere ugualmente. Dopo linstallazione si trover un file denomi nato ASP.NET Access Providers.zip nella cartella C:\users\domenico\documents\visual studio 2005\templates\ProjectTemplates\Visual Web Developer; questo zip un file di modello di Visual Studio 2005, e non bisogna decomprimerlo 2. avviamo Visual Studio 2005, e dal menu File selezioniamo New Project; nella finestra che si apre espandiamo il nodo Visual C# selezionando Starter Kits: nel riquadro di destra vediamo che esiste il modello ASP.NET Access Providers, che quello che abbiamo installato nel passaggio precedente:

sabato 6 luglio 2013 Pag. 14 / 151

SVILUPPARE UN SITO WEB ASP.NET

Viene cos creato un nuovo progetto con tutti i file necessari per costruire, configurare ed avviare unapplicazione con i provider di Access. La finestra Solution Explorer appare cos:

3. Il passo successivo da effettuare quello di dare un nuovo nome allassembly creato. Se durante la creazione del nuovo progetto si mantengono tutti i valori che vengono proposti, il nome del file .dll proposto da VB si chiamerebbe ASP.NET Access Providers1.dll. Il file di configurazione si aspetta invece che la .dll si chiami SampleAccessProviders.dll, pertanto occorre modificarlo in conformit. Per far ci, in Solution Explorer fare click con il tasto destro sul progetto e selezionare Properties (in alternativa, dal menu principale del progetto scegliere Properties ASP.NET Access Providers1). Nel tab Application mostrato sotto, cambiare lAssembly name in SampleAccessProviders:

Si pu chiudere la finestra di dialogo: le modifiche verranno salvate automaticamente. quindi ora di salvare il progetto. Premendo Ctrl+S, in Visual Studio Express, Visual C# chiede la locazione in cui salvarlo, utilizzando invece una versione diversa da Express Edition, la finestra di dialogo non appare, perch la locazione stata scelta al momento della creazione del progetto 4. Compilare il progetto: in ambiente diverso da Visual C# Express Edition dal menu Build selezionare Configuration Manager; nella relativa finestra assicurarsi che nella lista Active solution configuration sia selezionato Release, e poi fare click su Close. Ancora dal menu Build fare click su Build ASP.NET Access Providers1
sabato 6 luglio 2013 Pag. 15 / 151

SVILUPPARE UN SITO WEB ASP.NET

nelle altre versioni di Visual Studio dal menu Build selezionare Build Solution

Queste azioni compilano il progetto in un assembly denominato SampleAccessProviders.dll nella cartella ASP.NET Access Providers1\bin\Release, o comunque nella locazione in cui stato salvato il progetto. Nella stessa cartella si trovano altri due importanti file: web.config e

ASPNetDB.mdb.
Con questo si terminato il lavoro allinterno del progetto per la compilazione in C# di Access Providers. Chiudiamo Visual Studio e torniamo al nostro SitoProve in Visual Web Developer. 5. Come prima operazione sostituiamo il web.config creato automaticamente da VWD con quello della cartella ASP.NET Access Providers1\bin\Release 6. apriamo il nuovo web.config nella finestra di VWD, e quasi alla fine subito prima del tag di chiusura - aggiungiamo le seguenti righe, che rappresentano i namespace di Net.Framwork che vengono utilizzati pi di frequente e che quindi bene far caricare allavvio dellapplicazione : <pages> <namespaces> <clear /> <add namespace="System" /> <add namespace="System.Collections" /> <add namespace="System.Collections.Specialized" /> <add namespace="System.Configuration" /> <add namespace="System.Text" /> <add namespace="System.Text.RegularExpressions" /> <add namespace="System.Web" /> <add namespace="System.Web.Caching" /> <add namespace="System.Web.SessionState" /> <add namespace="System.Web.Security" /> <add namespace="System.Web.Profile" /> <add namespace="System.Web.UI" /> <add namespace="System.Web.UI.WebControls" /> <add namespace="System.Web.UI.WebControls.WebParts" /> <add namespace="System.Web.UI.HtmlControls" /> </namespaces> </pages> 7. sempre prelevando i file dalla cartella ASP.NET Access Providers1\bin\Release, copiamo nel nostro sito i file SampleAccessProviders.dll nella cartella /bin, e ASPNetDB.mdb nella cartella /mdb-database. 8. torniamo al web.config e modifichiamo, allinizio, la stringa di connessione (notare lutilizzo della tilde (~/) nel link: vedere in proposito lAppendice a pag.60), da:

<add name="AccessFileName" connectionString="~/App-Data/ASPNetDB.mdb" providerName="System.Data.OleDb"/>


a:

<add name="AccessFileName" connectionString="~/mdbdatabase/ASPNetDB.mdb" providerName="System.Data.OleDb"/>


9. con le precedenti operazioni abbiamo predisposto il sito affinch lavori con un database MS Access anzich SQL Server. Per verificare che tutto sia andato a buon fine, dal menu Sito web di Visual Web Developer scegliamo Configurazione di Asp.Net. Si apre linterfaccia di Strumento di Amministrazione sito WEB (WSAT): facciamo click sul tab Provider, e poi sul link Selezionare un provider diverso per ciascuna tipologia (opzione avanzata). Sulla schermata che segue si pu vedere che ora il Provider Access selezionato per entrambe le funzionalit Membership (Provider delle appartenenze) e Roles (Provider dei ruoli):

sabato 6 luglio 2013 Pag. 16 / 151

SVILUPPARE UN SITO WEB ASP.NET

ESAME ED INTEGRAZIONE DEL DATABASE ASPNETDB.MDB DI MS ACCESS


Il database ASPNetDB.mdb fornito con i provider di Access predisposto con tutte le tabelle, query e relazioni necessarie per limplementazione della sicurezza di Asp.Net 2.0. Anche se potremmo utilizzarlo senza saper nulla di quel che succede al suo interno, utile esaminarne la struttura, anche per avere consapevolezza di quel che potremo fare quando andremo ad intervenire nei dati: pertanto usciamo da VWD, apriamo linterfaccia di Microsoft Access, e dallinterno di questo programma apriamo SitoProve\mdbdatabase\ASPNetDB.mdb. Le operazioni che seguono sono delicate, in quanto modifiche alla struttura del database potrebbero comprometterne il funzionamento; quindi: accertarsi di aver aperto proprio il database allinterno di Sito Prove, in modo che nel caso che inavvertitamente dovessimo fare qualche danno possiamo sempre sostituirlo con loriginale di cui al paragrafo precedente (almeno finch non abbiamo ancora immesso dati: altrimenti con la sostituzione perderemmo tutte le impostazioni utente, ruoli e cos via) per esaminarlo navighiamone gli oggetti senza fare alcuna modifica, se in chiusura di un oggetto ci viene chiesto di salvare, diciamo di no Dopo aver navigato un po tra le varie tabelle e query, dal menu Strumenti apriamo Relazioni, ci troveremo di fronte a questo prospetto:

sabato 6 luglio 2013 Pag. 17 / 151

SVILUPPARE UN SITO WEB ASP.NET

In esso possiamo vedere tutti i campi di tutte le tabelle del database e le relazioni che intercorrono tra di loro attraverso i campi chiave. Vediamo allora che, per quanto riguarda gli utenti, le principali informazioni personali su cui nel prosieguo andremo ad intervenire e che vengono gestite automaticamente dal provider Access sono: UserId numero univoco (campo contatore) generato in aspnet_Users ed utilizzato in diverse tabelle per correlare i dati dellutente UserName laccount nella tabella aspnet_Users Password Email PasswordQuestion PasswordAnswer IsApproved RoleId abilitazione allaccesso numero univoco (campo contatore)

aspnet_Membership nella tabella aspnet_Membership nella tabella aspnet_Membership nella tabella aspnet_Membership nella tabella aspnet_Membership generato in aspnet_Roles ed utilizzato in aspnet_UsersInRoles
nella tabella per correlare i dati dellutente nella tabella aspnet_ Roles

RoleName

definizione del nome del ruolo

Volendo salvare altre informazioni di uso comune nella gestione degli utenti (nome, cognome, indirizzo e cos via) potremmo ricorrere alla funzionalit intrinseca Profili, che le inserisce nella tabella aspnet_Profile, ma che, a causa delle sue specifiche di memorizzazione, ha un grosso difetto: non c la possibilit di estrarne i dati mediante query sul database. Bene, dopo aver esaminato il database e dopo la precedente considerazione ora ci contraddiciamo: se vogliamo utilizzare lo stesso database anche per implementare un sistema pi flessibile dei Profiles per la gestione dei dati aggiuntivi degli utenti, dobbiamo procedere ad alcune personalizzazioni; perch non vero che il database non si pu modificare, ma per evitare danni occorre saper bene ci che si fa e saper evitare le possibili conseguenze dannose. 1. Creiamo una nuova Tabella

DatiAggiunti, ed aggiungiamo i seguenti campi:


Tipo dati

Nome campo

UserID NomeCompleto nazione cap citt provincia indirizzo telcasa telufficio fax cellulare sitoweb

numerico Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo

Intero lungo 50 15 7 20 20 100 30 30 30 30 250

Dimensione / formato

Richiesto

Indicizzato

Si No No No No No No No No No No No

Si (chiave) No No No No No No No No No No No

Al termine dellinserimento salviamo la tabella e chiudiamola. 2. Apriamo la finestra Relazioni, facciamo click al suo interno con il tasto destro scegliendo Mostra Tabella; dallelenco che si apre, selezioniamo la nostra nuova tabella e clicchiamo su Aggiungi: la tabella apparir allinterno della finestra Relazioni. 3. Creiamo una relazione sul campo UserID tra aspnet_Users e DatiAggiunti (se occorre, riferirsi alla documentazione di Microsoft Access): il tipo di join deve essere Includi tutti i record di aspnet_Users e solo i record di DatiAggiunti in cui i campi collegati sono uguali. 4. Chiudiamo Relazioni e passiamo al tab Query, facciamo click su Nuovo e nella finestra Nuova Query dopo aver verificato che sia selezionato Visualizzazione Struttura facciamo click si OK. 5. In Struttura Query inseriamo le tabelle aspnet_Roles, aspnet_UsersInRoles: lasciamo le relazioni preimpostate

aspnet_Users

sabato 6 luglio 2013 Pag. 18 / 151

SVILUPPARE UN SITO WEB ASP.NET

6. Inseriamo i campi come mostrato dalla griglia:

Salviamo la Query con il nome

RuoliIscritti. La stringa SQL sar la seguente:

SELECT aspnet_UsersInRoles.UserId, aspnet_Users.UserName, aspnet_Roles.RoleId, aspnet_Roles.RoleName FROM aspnet_Users INNER JOIN (aspnet_Roles INNER JOIN aspnet_UsersInRoles ON aspnet_Roles.RoleId = aspnet_UsersInRoles.RoleId) ON aspnet_Users.UserId = aspnet_UsersInRoles.UserId;
7. Impostiamo una nuova query dal tab Query. Nella struttura inseriamo le tabelle DatiAggiunti, aspnet_Users, aspnet_Membership e RuoliIscritti, impostando le seguenti relazioni:

aspnet_Users aspnet_Users aspnet_Users

aspnet_Membership DatiAggiunti RuoliIscritti

includi tutti i record di aspnet_Users record di aspnet_Membership in cui collegati sono uguali includi tutti i record di aspnet_Users record di DatiAggiunti in cui i campi sono uguali includi tutti i record di aspnet_Users record di RuoliIscritti in cui i campi sono uguali

e solo i i campi e solo i collegati e solo i collegati

sabato 6 luglio 2013 Pag. 19 / 151

SVILUPPARE UN SITO WEB ASP.NET

8. Inseriamo i campi come mostrato dalla griglia:

e questa la stringa SQL della query in costruzione:

SELECT aspnet_Users.UserId, aspnet_Users.UserName, RuoliIscritti.RoleName, aspnet_Membership.Email, aspnet_Membership.PasswordQuestion, aspnet_Membership.PasswordAnswer, aspnet_Membership.IsApproved, aspnet_Membership.CreateDate, aspnet_Membership.LastLoginDate, DatiAggiunti.NomeCompleto, DatiAggiunti.nazione, DatiAggiunti.cap, DatiAggiunti.citt, DatiAggiunti.provincia, DatiAggiunti.indirizzo, DatiAggiunti.telcasa, DatiAggiunti.telufficio, DatiAggiunti.fax, DatiAggiunti.cellulare, DatiAggiunti.sitoweb FROM ((aspnet_Users LEFT JOIN DatiAggiunti ON aspnet_Users.UserId = DatiAggiunti.UserId) LEFT JOIN RuoliIscritti ON aspnet_Users.UserId = RuoliIscritti.UserId) LEFT JOIN aspnet_Membership ON aspnet_Users.UserId = aspnet_Membership.UserId ORDER BY aspnet_Users.UserId DESC;
9. Salviamo la query con il nome

SpecIscritti e chiudiamo Access.

Teniamo presente che nellapplicazione che andremo a costruire ogni utente pu appartenere ad uno soltanto dei ruoli previsti: la query precedente funziona su questa premessa, ed essa ci servir per mostrare tutti i dati significatifi relativi agli utenti, sia dalle tabelle di default che da quella personalizzata, non per modificarli (le modifiche verranno apportate con funzionalit asp.net sulle tabelle di default, con query di comando sulla nostra tabella personalizzata).
sabato 6 luglio 2013 Pag. 20 / 151

SVILUPPARE UN SITO WEB ASP.NET

Tale premessa comporta che se vogliamo che gli utenti che appartengono ad un ruolo superiore partecipino alle prerogative del ruolo inferiore, dobbiamo tenerne conto nellat tribuzione dei permessi (regole di accesso pag.23). Qualora, invece, volessimo scegliere la tecnica di attribuire pi di un ruolo agli utenti, dovremmo anche scegliere una tecnica diversa per visualizzare contemporaneamente tutti i dati.

INSERIMENTO DI RUOLI ED UTENTI


Infine inseriamo dei dati per un amministratore ed alcuni ipotetici iscritti, che ci serviranno per compiere i test nei passaggi successivi. 1. Apriamo nuovamente Visual Web Developer sul nostro SitoProve. dal menu Sito web scegliamo Configurazione di Asp.Net. Si apre linterfaccia di Strumento di Amministrazione sito WEB (WSAT): facciamo click sul tab Sicurezza, e poi sul link Crea o gestisci ruoli. Nella casella Crea nuovo ruolo scriviamo Amministratori e facciamo click sul pulsante Aggiungi ruolo; il ruolo inserito viene mostrato in basso; si ripropone la casella di inserimento, su cui scriviamo Iscritti e di nuovo click sul pulsante Aggiungi ruolo; ora lapplicazione ha due ruoli, Amministratori e Iscritti, come mostrato nella finestra.

2.

3.

Torniamo indietro alla scheda Sicurezza e facciamo click sul link Crea utente. Immettiamo innanzitutto un utente per il ruolo Amministratori:

sabato 6 luglio 2013 Pag. 21 / 151

SVILUPPARE UN SITO WEB ASP.NET

4.

Facendo click sul pulsante Crea utente limmissione viene convalidata e ci viene presentata la possibilit di crearne altri. Ne creiamo un certo numero, per i quali per nel riquadro a destra selezioniamo il ruolo Iscritti, deselezionando Amministratori; lasciamo la spunta su Utente attivo per tutti tranne che due (se l'opzione non selezionata, le informazioni sull'utente verranno archiviate nel database, ma l'utente non sar in grado di accedere al sito Web). Teniamo presente che il nome utente che qui si inserisce non il nome effettivo ma l account, cio il nome prescelto per accreditarsi al sito. Nella finestra Gestisci utenti, sempre nel tab Sicurezza, si possono visualizzare, modificare, eliminare gli utenti ed i rispettivi ruoli:

Per finire, se vogliamo possiamo aprire nuovamente il database in Access per scoprire come i dati che abbiamo immesso sono stati memorizzati nelle Tabelle. Memo Password Riportiamo di seguito alcune delle password che abbiamo impostato al momento della creazione degli utenti (in rosso per il ruolo Amministratori), in quanto ci potranno servire per i test, e non abbiamo altri mezzi per visualizzarle: Utente Cervantes Domenico Hugo Mascagni Morante Moravia Musil Prokofiev Puccini Vivaldi Wagner pwd Cervan14 Dom2 Hugo15 Masc3 Moran13 Morav12 Mus4 Proko6 Pucci7 Vival10 Wagn11 e-mail cerv@prove.it domenico@decerbo.i t hugo@prove.it mascagni@prove.it morant@prove.it morav@prove.it musil@prove.it prokof@prove.it pucci@prove.it vival@prove.it wagner@prove.it Attivo

sabato 6 luglio 2013 Pag. 22 / 151

SVILUPPARE UN SITO WEB ASP.NET

DEFINIZIONE DELLE REGOLE DI ACCESSO


Impostati i Ruoli e gli Utenti, dobbiamo definire le regole di accesso, cio stabilire chi pu accedere alle risorse del sito. Essendo il nostro sito molto semplice, occorre: concedere laccesso a tutti sulla pagina iniziale, Default.aspx concedere laccesso ai soli Amministratori ai contenuti della cartella admin concedere laccesso agli Iscritti ed agli Amministratori ai contenuti della cartella private Ci si pu fare sia con il WSAT, che scrivendo direttamente sui file web.config di ciascuna cartella: seguiamo il primo metodo, vedendo nel contempo i file di configurazione creati. 1. Sempre dallinterfaccia di Strumento di Amministrazione sito WEB (WSAT), facciamo click sul tab Sicurezza, e poi sul link Crea regole di accesso.

2.

per ciascuna cartella creare una regola (Consenti o Nega) per Amministratori, Iscritti, utenti anonimi; si otterranno: web.config della root del sito <authorization> <allow users="*" /> <allow users="?" /> </authorization> Consente laccesso a tutti gli utenti, anche anonimi (?) web.config della cartella /private <authorization> <allow roles="Amministratori" /> <allow roles="Iscritti" /> <deny users="?" /> </authorization> Consente laccesso agli amministratori ed agli iscritti, lo nega agli utenti anonimi; questa regola sovrascrive quella della cartella superiore (root) web.config della cartella /admin <authorization> <allow roles="Amministratori" /> <deny roles="Iscritti" /> <deny users="*" /> <deny users="?" /> </authorization> Consente laccesso agli amministratori, lo nega agli iscritti ed a tutti gli utenti, compresi quelli anonimi anonimi; questa regola sovrascrive quella della cartella superiore (root)

Abbiamo cos finito di definire tutti i parametri relativi alla sicurezza, che poi le pagine dovranno gestire.

sabato 6 luglio 2013 Pag. 23 / 151

SVILUPPARE UN SITO WEB ASP.NET

1. AREA P UBBLICA DEFAULT.ASPX: LA HOME PAGE


Definiamo la pagina iniziale: Ne costruiamo il layout attraverso il posizionamento dei <div> [impostandone i parametri nel file CSS fissi.css (listato in Appendice, pag.106), che viene richiamato nell<head> della pagina]. Inseriamo del testo nelle varie zone. Inseriamo un controllo Login per laccesso alle aree Iscritti ed Amministratore. 1. dal tab Casella degli strumenti trasciniamo allinterno della colonna destra della pagina il controllo ASP.Net Login 2. nella finestra Progettazione di VWD evidenziamo il controllo, facciamo click sulla piccola freccia a destra e clicchiamo su Converti in modello: in tal modo, tornando alla finestra Origine avremo molte pi opzioni a disposizione sui singoli elementi dell oggetto, fra cui gli adattamenti alle dimensioni della colonna in cui si trovano 3. il

DestinationPageUrl sulla pagina che deve essere aperta se il login stato effettuato
con successo, ma a noi interessa diversificare le pagine di destinazione, a seconda del ruolo cui appartiene chi si accredita; pertanto non valorizziamo quella propriet e seguiamo i passi successivi

controllo

cos

com

potrebbe

funzionare

soltanto

impostando

la

propriet

4. fra le propriet del controllo specifichiamo OnLoggingIn="OnLoggingIn", che indica il codice che dovr essere eseguito se lautenticazione riesce 5. nel file default.aspx.vb scriviamo la seguente procedura di evento:

Sub OnLoggingIn(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.LoginCancelEventArgs) If Roles.IsUserInRole(LogDefault.UserName, "Amministratori") Then LogDefault.DestinationPageUrl = "~/admin/amministra.aspx" ElseIf Roles.IsUserInRole(LogDefault.UserName, "Iscritti") Then LogDefault.DestinationPageUrl = "~/private/iscritti_home.aspx" End If End Sub
Questa procedura individua il ruolo dellutente che si connesso: se appartiene al ruolo degli Amministratori, apre la home page dellamministratore, se appartiene al ruolo Iscritti apre la home page dellarea iscritti. 6. infine prevediamo lipotesi che lutente non riesca ad accreditarsi (ha dimenticato la password etc.): allora inseriamo un controllo HyperLink con cui diamo possibilit allutente di inviare una e-mail al Webmaster per descrivere il problema. Non abbiamo previsto la possibilit da parte dei visitatori di effettuare una registrazione ex novo in quanto il sito che stiamo sviluppando non aperto a tutti gli utenti della rete, quindi la registrazione, per avere la possibilit di accesso alle aree protette, pu essere fatta solo dal Webmaster previa verifica dei requisiti di appartenenza (qualit di socio o simili). A proposito delle password, precisiamo che, per maggior sicurezza, abbiamo impostato nel web.config che debbano essere in formato hash (fra laltro il formato richiesto dal Garante della Privacy): le password con tale formato non possono essere recuperate, quindi non pu neppure essere utilizzato il controllo PasswordRecovery, che in Asp.Net servirebbe per consentire ad un utente il recupero da remoto della password. Allora occorre che lutente invii una e-mail al Webmaster, il quale dovr creare per lutente stesso una nuova password, ed inviargliela per e -mail. Lutente poi provveder a cambiarla attraverso il controllo ChangePassword, che trover nella pagina, dopo essersi collegato con quella inviatagli. 7. Per il resto non ci sono differenze costruttive rispetto ad una pagina HTML client-side.

sabato 6 luglio 2013 Pag. 24 / 151

SVILUPPARE UN SITO WEB ASP.NET

E questo il risultato nel browser (che si ottiene cliccando sullicona strumenti di VWD):

che appare sulla barra degli

sabato 6 luglio 2013 Pag. 25 / 151

SVILUPPARE UN SITO WEB ASP.NET

2. AREA AMMINISTRATORE
AMMINISTRA.ASPX: LA HOME PAGE DELLAREA AMMINISTRAZIONE
Questa pagina ha funzioni esclusivamente informative, la gestione dei dati degli iscritti, attivit fondamentale di un webmaster, demandata alle altre pagine dellArea. molto simile nellaspetto a quella precedente, e presenta le seguenti caratteristiche: Nella colonna centrale espone un riepilogo dei dati degli iscritti Nella colonna di sinistra ha un menu di navigazione del sito Nella colonna di destra contiene un controllo calendario.

pi pratico qui modificare il codice della home page, piuttosto che ricominciare il lavoro da capo, quindi nellinterfaccia di VWD conviene lavorare su finestre doppie: dopo aver aperto in visualizzazione Origine la pagina amministra.aspx facendoci doppio click in Esplora soluzioni - dal menu Finestra selezioniamo Nuovo gruppo di schede orizzontali, e nelle due finestre sovrapposte che apparirannomettiamo in primo piano, tramite le linguette superiori, in una Default.asp e nellaltra amministra.aspx. Ora, con il copia/incolla, sostituiamo tutto il codice della seconda con quello della prima; modifichiamo subito lid di pagina in <form id="home_admin", i collegamenti dei file richiamati [leggere in Appendice a pag.60 la sintassi per le path relative in (X)HTML e ASP.Net] e le occorrenze di testo Area Pubblica con Area Amministratore. Per avere una visione pi ampia torniamo alla finesta singola di VWD (trascinando le linguette dellarea inferiore sullarea superiore), e quindi procediamo alle modifiche: 1. Cancelliamo tutto il contenuto allinterno di <div id="int_admin"> e lo sostituiamo con un controllo LoginView (prima di proseguire, leggiamone le caratteristiche in Appendice, a pag.90) 2. tenendo presente che ci troviamo in una pagina cui possono accedere solo gli utenti che si accreditano con il ruolo Amministratori, inseriamo i controlli che consentano di mostrare il nome dellamministratore connesso: <asp:LoginView ID="LoginView1" runat="server"> <RoleGroups> <asp:RoleGroup Roles="Amministratori"> <ContentTemplate><h5><span class="giallo"> Area Amministrazione - Utente collegato: <asp:LoginName ID="LoginName1" runat="server" /></span></h5> </ContentTemplate> </asp:RoleGroup> </RoleGroups> </asp:LoginView> 3. Infine allinterno dello stesso <div> inseriamo un piccolo controllo allutente in linea di fare il logout.

LoginStatus, che consente

Fatti i piccoli interventi di formattazione che possiamo vedere in Appendice nel codice, il risultato sar il seguente:

Menu di navigazione
4. Cancelliamo tutto il contenuto allinterno di <div id="colonna-sx"> e lo sostituiamo con un controllo TreeView, che ha la caratteristica di visualizzare i contenuti che si impostano nella stessa forma di esplora risorse di Windows Premessa sul web.sitemap controllo TreeView fornisce linterfaccia a dati che vengono raccolti da un controllo SiteMapDataSource dallorigine dei dati; questultima un file XLM, che nel caso di menu in Il genere il web.sitemap. Questo file, che occorre elaborare in base a regole sintattiche definite, si
sabato 6 luglio 2013 Pag. 26 / 151

SVILUPPARE UN SITO WEB ASP.NET

trova nella root del sito, e di default viene richiamato senza bisogno di instanziarlo dal SiteMapDataSource. Se per si vogliono impostare pi origini dati, per ogni area del sito, occorre elaborare altrettanti web.sitemap, definirli come provider nel web.config ed instanziarli nel SiteMapDataSource. Ed questa la strategia che qui attuiamo. Dal menu Sito web di VWD scegliamo Aggiungi nuovo elemento, e nella finestra di modelli scegliamo Mappa del sito, impostando per il file il nome WebAdmin.sitemap Questo file appare nella finestra con alcune impostazioni; poich stiamo predisponendo il menu per Amministratori, che possono accedere a tutte le aree, lo completiamo con la struttura di tutte le pagine del sito (possiamo vedere il listato in Appendice a pag.105). Torniamo al menu Sito web > Aggiungi nuovo elemento > Mappa del sito, impostando per il file il nome WebIscritti.sitemap poich ora stiamo predisponendo il menu per Iscritti, lo completiamo con la struttura delle sole pagine del sito cui questi possono accedere (possiamo vedere il listato in Appendice a pag.106). apriamo il file web.config nella root del sito, e valorizziamo il provider per SiteMap, con i riferimenti ai precedenti *.sitemap: <siteMap defaultProvider="Iscritti"> <providers> <add name="Admin" type="System.Web.XmlSiteMapProvider" siteMapFile="WebAdmin.sitemap" /> <add name="Iscritti" type="System.Web.XmlSiteMapProvider" siteMapFile="WebIscritti.sitemap" /> </providers> </siteMap> </system.web> 5. torniamo al nostro controllo TreeView; nella visualizzazione Progettazione lo evidenziamo e facciamo click sulla freccetta in alto: in Selezionare origine dati scegliamo <Nuova origine dati>; si apre la finestra Configurazione guidata origine dati, in cui selezioniamo SiteMap 6. accettiamo il nome SiteMapDataSource1: viene inserito un controllo SiteMapDataSource, che, in modalit Origine, referenziamo affinch tragga origine dal WebAdmin.sitemap: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" SiteMapProvider="Admin" /> 7. apriamo la pagina nel browser cliccando sullicona (notiamo che si apre la home page del sito: la pagina richiesta non subito accessibile perch non ci siamo ancora accreditati, quindi in questa inseriamo account e password), ed ecco il risultato, con varie espansioni dei nodi:

8. Sotto al menu, inseriamo un controllo ChangePassword: questo controllo d la possibilit allutente connesso (in questo caso allamministratore) di cambiare la propria password; esso gestito interamente da Asp.Net, per cui non occorre far altro che inserirlo nel punto in cui si vuole che appaia, salvo eventuali modifiche di formattazione, che qui abbiamo fatto per adattarlo alla colonna.
sabato 6 luglio 2013 Pag. 27 / 151

SVILUPPARE UN SITO WEB ASP.NET

Controllo Calendario
9. Inseriamo un controllo calendario: nella Casella degli strumenti a scomparsa di VWD espandiamo il nodo Standard, selezioniamo Calendar (v. specifiche in Appendice a pag.87) e trasciniamolo nel div (che abbiamo precedentemente svuotato) della colonna destra 10. in visualizzazione Progettazione, facciamo click con il pulsante destro sul controllo, e dal menu contestuale che si apre clicchiamo su Formattazione automatica: si apre una finestra in cui scegliamo uno schema e clicchiamo su Applica; verifichiamo il risultato, poi se vogliamo possiamo intervenire nelle propriet del controllo per modificare l aspetto di alcuni elementi 11. intervenendo in admin.css (listato a pag.110) modifichiamo il comportamento dell id elemento #colonna-dx, rendendo la colonna a larghezza fissa per adattarla al controllo calendario 12. nel file amministra.aspx allinterno del tag <asp:Calendar, direttamente o tramite il pannello Propriet di VWD, aggiungiamo la propriet SelectionMode="Day". In tal modo lutente avr la possibilit di selezionare sul calendario una data diversa da quella corrente del sistema operativo. Aggiungiamo inoltre la propriet OnSelectionChanged="Selection_Change", che abilita la gestione dellevento del cambiamento di data nel calendario attraverso la routine Sub Selection_Change, da programmare in amministra.aspx.vb. 13. Ora impostiamo una scritta che ci fornisce un riepilogo degli iscritti: 14. nella colonna centrale introduciamo tre controlli

Literal (Appendice pag.87):

a ) il primo (ID="MessageOggi") contiene il testo Iscritti abilitati all'accesso alla data di oggi:, che in fase di esecuzione viene modificato con linserimento della data di sistema, attraverso la seguente routine Sub MessageOggi_Load(ByVal sender As Object, ByVal e As EventArgs) Dim Oggi As DateTime MessageOggi.Text = "" Oggi = System.DateTime.Now() MessageOggi.Text = "Iscritti abilitati all'accesso alla data di " & Oggi.ToLongDateString() End Sub b ) Facciamo in modo che il secondo controllo (ID="IscrittiOggi" Text="Totale iscritti nr." OnLoad="IscrOggiNr_Load") mostri il totale degli iscritti. Innanzitutto in amministra.aspx.vb scriviamo le seguenti routine: Function CreaStringaConnessione() As String Dim Parte1 As String, Parte2 As String, Parte3 As String Parte1 = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " Parte2 = Server.MapPath("~\mdb-database\ASPNetDB.mdb") Parte3 = "; Persist Security Info = False" CreaStringaConnessione = Parte1 & Parte2 & Parte3 End Function La funzione qui sopra restituisce la stringa di connessione (Appendice pag.62) OLE DB necessaria a collegarsi al database di MS Access. Da rilevare lutilizzo del metodo Server.MapPath: poich la stringa di connessione richiede il percorso assoluto del database di origine, occorre fare in modo che essa sia valida anche portando il sito dallambiente di sviluppo a quello di produzione; tale compito viene assunto da MapPath, che partendo dal percorso relativo allinterno del sito restituisce il percorso fisico del file sul server Web. Viene inoltre impostata su false, per motivi di sicurezza, la chiave Persist Security Info: in tal modo se occorre inserire ID utente e password quando si effettua la connessione, le informazioni verranno eliminate subito dopo l'utilizzo per aprirla (non il nostro caso, ma bene tenerlo presente, ed anche se non serve inserirla non costa nulla). Function EstraeIscritti() As String Dim NrIscritti As Int32, strIscrSQL As String Dim ConnIscritti As New System.Data.OleDb.OleDbConnection() strIscrSQL = "SELECT COUNT(UserId) FROM SpecIscritti" ConnIscritti.ConnectionString = CreaStringaConnessione() sqlIscritti.CommandText = strIscrSQL sqlIscritti.Connection = ConnIscritti ConnIscritti.Open() NrIscritti = Convert.ToInt32(sqlIscritti.ExecuteScalar()) EstraeIscritti = CStr(NrIscritti) End Function
sabato 6 luglio 2013 Pag. 28 / 151

SVILUPPARE UN SITO WEB ASP.NET

La precedente funzione ha lo scopo di individuare il numero di iscritti, che coincide con il numero di record presenti nel database. A tal fine svolge, nellordine, le seguenti operazioni: Nella prima riga si crea listanza ConnIscritti delloggetto OleDbConnection, che occorre popolare con i dati Nella terza riga si definisce una stringa di testo con unistruzione SQL (Appendice pag. 65) che imposta quali dati occorre prelevare. Nel nostro caso dobbiamo contare tutti i record della query SpecIscritti. Nella riga successiva attribuisce allistanza della connessione la stringa risultante dalla funzione precedente Con la quinta riga si imposta allistruzione SQL il comando di testo da eseguire sull'origine dati. Infine imposta la connessione con tutti gli elementi sopra passati, e apre la connessione. A questo punto comincia lestrazione dei dati, che vengono restituiti dalla query con il metodo sqlIscritti.ExecuteScalar() (Appendice pag.65) sotto forma di oggetto, e con listruzione Convert.ToInt32 vengono convertiti in numero intero, per essere assegnati alla variabile NrIscritti Infine tale variabile, convertita in stringa, fornisce il valore che la funzione restituice.

Ora entra in funzione (in senso logico, perch nel flusso del programma entrata in funzione prima, avendo essa chiamato la funzione precedente) la seguente routine, che scrive il numero degli iscritti, al momento del caricamento sulla pagina, allinterno del controllo ID="IscrittiOggi" Sub IscrOggiNr_Load(ByVal sender As Object, ByVal e As EventArgs) IscrittiOggi.Text = "Totale iscritti nr." IscrittiOggi.Text &= EstraeIscritti() ChiudeConnIscritti() End Sub e nellultima riga richiama la procedura seguente, che chiude la connessione. Sub ChiudeConnIscritti() sqlIscritti.Connection.Close() End Sub Anche se ASP.Net in alcuni casi chiude automaticamente le connessioni, se non si certi che ci avvenga sempre bene chiuderle esplicitamente, sia per risparmio di risorse che per motivi di sicurezza. c ) Ora facciamo in modo che il terzo controllo (ID="AbilitatiOggi" Text=" - Totale abilitati nr." OnLoad="AbilOggiNr_Load") mostri il numero degli iscritti che sono abilitati ad entrare nelle aree riservate del sito. Pertanto in amministra.aspx.vb scriviamo le relative routine: per la stringa di connessione usa Function CreaStringaConnessione(), la stessa che abbiamo gi scritto per il controllo precedente; le altre a parte il cambiamento dei nomi presentano una sola differenza sostanziale: strAbilSQL = "SELECT COUNT(UserId) FROM SpecIscritti WHERE IsApproved = true" cio la query SQL: qui con la clausola WHERE si ottiene il risultato che vengono contati solo i record in cui il campo IsApproved posto su true. 15. Il risultato sar che quando apriamo la pagina, sul browser la parte che abbiamo appena sviluppato apparir cos:

Nei passi successivi implementiamo, nella colonna centrale, un prospetto riepilogativo globale degli iscritti.

sabato 6 luglio 2013 Pag. 29 / 151

SVILUPPARE UN SITO WEB ASP.NET

Prospetto Iscritti abilitati allaccesso


16. Sempre nella pagina amministra.aspx posizioniamo il cursore subito dopo lultimo abbiamo creato in precedenza, ed apriamo la sezione Dati della barra degli strumenti.

Literal che

a ) Trasciniamo nella posizione del cursore il controllo necessario per la connessione ai dati, nel nostro caso quello per connetterci al database Access ASPNetDB.mdb, che AccessDataSource (vedi Appendice a pag.87): viene inserito il tag che lo definisce; modifichiamo lid, per facilitarne lidentificazione, in ID="AccessDS_HomeAdmin" b ) allinterno dei tag del controllo inseriamo: datasourcemode="DataSet" i dati vengono caricati in un oggetto DataSet e memorizzati nella memoria del server, consentendo funzionalit di ordinamento, filtraggio e paging. connette al database di origine istruzione SQL con cui si imposta la tabella (nel nostro caso la query che abbiamo aggiunto al database) di origine (FROM) e, in relazione agli scopi che qui ci proponiamo, i campi che devono essere compresi (SELECT) ed un filtro sui dati (WHERE).

datafile="~/mdbdatabase/ASPNetDB.mdb"> SelectCommand="SELECT UserId, NomeCompleto, CreateDate, IsApproved FROM [SpecIscritti] WHERE IsApproved = true ORDER BY NomeCompleto"

d ) occorre poi un controllo per la visualizzazione dei dati, quindi dalla barra strumenti trasciniamo subito sotto al precedente il controllo GridView (vedi Appendice a pag.89): anche qui ne modifichiamo lid in ID="GridView_HomeAdmin" e ) allinterno dei tag del controllo impostiamo le seguenti propriet: DataSourceID="AccessDS_HomeAdmin" EmptyDataText="nessun iscritto" AutoGenerateColumns="false" Imposta il riferimento allid del gestore dellaccesso ai dati, AccessDataSource Definisce una stringa che viene mostrata a video qualora nellorigine non vi siano dati Posto su false, impedisce che i campi siano generati automaticamente e ne consente quindi limpostazione personalizzata (attaverso il passaggio Modifica colonne descritto sotto) Suddivide automaticamente i record in pagine. Per impostazione predefinita, il controllo GridView visualizza 10 record per volta in una pagina: per cambiare il numero di record visualizzati in una pagina, impostare la propriet PageSize. Consente di ordinare, cliccando sul titolo, in ordine crescente o descescente le colonne a cui sia impostata la propriet SortExpression

AllowPaging="True"

AllowSorting="True"

f ) Passiamo in visualizzazione Progettazione. Cliccando sulla freccetta in alto a destra del controllo GridView appare un menu contestuale che ci consente limpostazione guidata dei parametri necessari: g ) Selezionare unorigine dati: nella casella a discesa gi selezionato lAccessDataSource che prima abbiamo creato, AccessDS_HomeAdmin h ) Cliccare su Modifica colonne: dai Campi disponibili aggiungiamo ai Campi selezionati due BoundField ed un CheckBoxField, cui nel riquadro a destra attribuiamo le seguenti propriet:

DataField (campo del


database)

NomeCompleto Iscritti true

dataiscrizione Data di Iscrizione true {0:d}

IsApproved Abil. true

HaederText (intestazione
colonna)

ReadOnly DataFormatString

sabato 6 luglio 2013 Pag. 30 / 151

SVILUPPARE UN SITO WEB ASP.NET

SortExpression

NomeCompleto

dataiscrizione

IsApproved

i ) Formattazione automatica: scegliamo quella che preferiamo, poi dalle Propriet del controllo potremo comunque modificare laspetto degli elementi. j ) Fin qui abbiamo implementato la Web Form in modo che nella griglia mostri soltanto gli iscritti abilitati allaccesso, in quanto questa pagina fondamentalmente u na pagina di visualizzazione per una panoramica veloce, gli interventi dellamministratore verranno svolti nell e pagine successive. Potrebbe comunque essere utile visualizzare anche gli iscritti non abilitati, e per far ci abbiamo fatto ricorso alla caratteristica MultiView (Appendice pag.90) di ASP.Net 2.0. k ) Come primo passo dal Pannello degli Strumenti inseriamo, subito prima del controllo AccessDataSource, un controllo Multiview, e dopo di questo due controlli View: <asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="0" EnableTheming="False"> <asp:View ID="MostraAbilitati" runat="server"> [a inserire il contenuto della prima vista] </asp:View> <asp:View ID="MostraTutti" runat="server"> [b inserire il contenuto della seconda vista] </asp:View> </asp:MultiView> Rispetto alle impostazioni inserite automaticamente da VWD abbiamo impostato la propriet ActiveViewIndex="0", che fa s che allavvio sia attivo il primo View, e poi abbiamo dato a quest i ID descrittivi, che ci agevolano nella lettura del codice. l ) Spostiamo tutti i tag dei controlli AccessDataSource e controllo View (a). Qui non dobbiamo fare nessuna modifica.

GridView allinterno del primo

m ) Copiamo tutto il contenuto del primo View nel secondo (b). Loperazione di copia ci assicura che tutti gli elementi di layout delle due viste saranno identici, e pertanto nella loro alternanza verranno modificati solo i dati, senza fastidioso spostamenti o sfarfallii. Qui invece, in questa seconda View, ovviamente dobbiamo intervenire per impostare le caratteristiche della vista.: In AccessDataSource si modifica lID in ID="DataSourceTutti" e soprattutto la stringa SQL affinch recuperi il contenuto di tutti i record del database: SelectCommand="SELECT UserId, NomeCompleto, CreateDate, IsApproved FROM [SpecIscritti] ORDER BY NomeCompleto" In GridView cambiamo lID in ID="GridView_Tutti" ed il collegamento allorigine dei dati in DataSourceID="DataSourceTutti"

Tutto il resto rimane invariato. n ) Ora occorre impostare linterfaccia per alternarsi tra le due viste. Nella colonna di sinistra, sotto al calendario, inseriamo due controlli Label e due controlli RadioButton. I due Label servono soltanto per descrivere, ad uso dellutente, la funzione dei pulsanti di opzione: <asp:Label ID="Label1" runat="server" Text="Alterna la visualizzazione nella griglia:"></asp:Label> <asp:Label ID="Label2" runat="server" Text="Tutti gli Iscritti / Solo abilitati all'accesso"></asp:Label> I due RadioButton consentono, gestiti dal codice sottostante che poi vedremo, di alternarsi tra le visualizzazioni: <asp:RadioButton ID="radioAbilitati" runat="server" AutoPostBack="true" GroupName="IndiceView" Text="Abilitati" OnCheckedChanged="radioAbilitati_Click" Checked="True" /> &nbsp; <asp:RadioButton ID="radioTutti" runat="server" AutoPostBack="true" GroupName="IndiceView" Text="Tutti" OnCheckedChanged="radioAbilitati_Click" /> Qui sono importanti gli ID, ID="radioAbilitati" e ID="radioTutti", perch servono di riferimento nel codice, e la propriet che imposta il riferimento alla routine che gestisce levento click, OnCheckedChanged="radioAbilitati_Click".

sabato 6 luglio 2013 Pag. 31 / 151

SVILUPPARE UN SITO WEB ASP.NET

o ) Completata

linterfaccia,

passiamo

al

motore.

Portiamo

in

primo

piano

in

VWD

il

file

amministra.aspx.vb, e per prima cosa inseriamo la routine che gestisce il caricamento della
pagina, che ancora non ci era capitato di utilizzare, e scriviamo il codice seguente: Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) If Not IsPostBack Then MultiView1.SetActiveView(MostraAbilitati) End If End Sub La struttura condizionale If Not IsPostBack determina lavvio del comando solo se la pagina viene caricata per la prima volta nella sessione, e non in risposta ad un PostBack del client. Il comando MultiView1.SetActiveView(MostraAbilitati)imposta la vista attiva al caricamento della pagina. p ) Inseriamo un enumeratore degli indici: Protected Enum IndiceView As Integer NotSet = -1 MostraAbilitati = 0 MostraTutti = 1 End Enum q ) Infine la routine pi importante, che gestisce il cambiamento della vista alla selezione di un pulsante RadioButton: Protected Sub radioAbilitati_Click(ByVal sender As Object, ByVal e As System.EventArgs) If MultiView1.ActiveViewIndex = 0 Then MultiView1.SetActiveView(MostraTutti) ElseIf MultiView1.ActiveViewIndex = 1 Then MultiView1.SetActiveView(MostraAbilitati) End If End Sub Il funzionamento molto semplice: rileva quale vista attiva, per attivare laltra. r ) Interveniamo nelle propriet dei vari controlli e del CSS per migliorare alcuni aspetti estetici (colori, font, spaziature etc.), dopodich loutput a schermo della pagina completa sar il seguente:

sabato 6 luglio 2013 Pag. 32 / 151

SVILUPPARE UN SITO WEB ASP.NET

Abbiamo cos terminato la pagina introduttiva dellamministratore di sistema.

sabato 6 luglio 2013 Pag. 33 / 151

SVILUPPARE UN SITO WEB ASP.NET

AUTORIZZAZIONI.ASPX E PANNELLO.ASPX: LE PAGINE PER LA GESTIONE DEGLI ISCRITTI


Ricordiamo che abbiamo modificato il database inserendo una nuova tabella con alcuni campi in pi rispetto a quelli gestiti dal Provider Access; per salvaguardare lintegrit dei dati, dobbiamo predisporre una duplice modalit di trattamento degli stessi: quelli contenuti nei campi predefiniti dovranno essere gestiti dai controlli e dai comandi specifici di Asp.Net, quelli personalizzati da procedure sviluppate ad hoc. Inoltre prevediamo per lamministratore due compiti ciascuno dei quali sar svolto in una pagina separata: la prima autorizzazioni.aspx destinata ad immettere nuovi utenti ed aggiungere nuovi ruoli, e la seconda pannello.aspx servir per le modifiche da apportare agli utenti esistenti. Infine, occorrer fare in modo che: I campi predefiniti (tranne IsApproved) possano essere modificati solo mediante le funzionalit di Asp.Net I campi personalizzati possano essere gestiti soltanto su utenti gi esistenti (anche nella prima pagina, in costanza di immissione dei nuovi utenti, questi campi potranno essere valorizzati solo dopo aver completato la prima parte, come vedremo). Nota: in alcune delle funzionalit che seguono, sono previsti scambi di informazioni tra controlli, per cui le informazioni in quelli contenute devono essere mantenute durante tutto il processo client-server-client; occorre pertanto tener presente questo flusso per impostare, ove occorra, la propriet AutoPostBack dei controlli interessati. Vedere in proposito lAppendice a pag.85.

AUTORIZZAZIONI.ASPX
1. Da amministra.aspx copiamo integralmente le sezioni <div id="intestazione"></div>, <div id="int_admin"></div> e <div id="colonna-sx"></div>, tranne il controllo per il cambio della password; copiamo lintera sezione <div id="footer">. copiamo limpostazione del <div id="principale_largo">, senza i contenuti. In questa sezione faremo tutte le operazioni che seguono. Allinizio inseriamo una descrizione dei compiti possibili nella pagina, e, utilizzando il tradizionale linguaggio client side html, inseriamo subito i titoli di ciascuna sezione, in modo da includere nella definizione dei titoli delle ancore che ci consentiranno di impostare nelle descrizioni dei link interni:

2. 3. 4.

Passiamo quindi al primo punto: linserimento delle informazioni di base , quelle cio che sono memorizzate nelle tabelle predefinite del database. Ciascuno dei passaggi che seguono sar inserito allinterno di un <div class=, che a sua volta conterr una <table con le rispettive righe e colonne. Registrazione utente Informazioni di base 1. Potremmo utilizzare il controllo CreateUserWizard, che ci fornisce gi pronto uno schema per linserimento di username e password e che pu essere esteso con altri campi, ma che comunque limitante perch, ad esempio, non prevede la valorizzazione del campo IsApproved. Preferiamo allora creare, attraverso una <table html, uno schema personalizzato con i seguenti campi (ci limitiamo a dare una descrizione delle funzioni, per vedere nel dettaglio come queste sono implementate occorre fare riferimento al codice):

sabato 6 luglio 2013 Pag. 34 / 151

SVILUPPARE UN SITO WEB ASP.NET

Account Password

<asp:TextBox <asp:TextBox

Conferma Password

<asp:TextBox

E-mail Domanda di sicurezza

<asp:TextBox

Risposta

<asp:TextBox

Abilitato?

<asp:RadioButtonList

Casella di testo che valorizza il campo UseName della tabella aspnet_Users Casella di testo che valorizza il campo password della tabella aspnet_Membership Casella di testo che ha lunica funzione di verificare la password immessa nella casella pracedente Casella di testo che valorizza il campo email della tabella aspnet_Membership <asp:DropDownList Elenco a scomparsa che prevede alcune opzioni fra cui scegliere quella che valorizza il campo PasswordQuestion della tabella aspnet_Membership Casella di testo che valorizza il campo PasswordAnswer della tabella aspnet_Membership include due RadioButton fra cui scegliere, uno che vale true ed uno che vale false; la scelta valorizza il campo IsApproved della tabella aspnet_Membership

Inseriamo poi un pulsante che, attraverso il codice, avvia limmissione dei dati nel database: <asp:Button ID="CreateUser" OnClick="CreateUser_OnClick" runat="server" Text="Registra l'Iscritto" /> Prima di a) b) c) avviare il salvataggio dei dati nel database, per, necessario verificare che: il nome di accont immesso non sia gi stato utilizzato tutte le caselle siano state compilate le immissioni siano valide

2. Il primo compito lo deleghiamo ad un evento OnLostFocus del controllo in cui si immette il nome utente, in modo da avere la verifica subito, prima di procedere oltre: se il nome gi esistente appare un messaggio di avviso; esaminiamo il codice: Public Function CercaNome(ByVal NomeImmesso As String) As Integer Dim returnValue As MembershipUserCollection returnValue = Membership.FindUsersByName(NomeImmesso) CercaNome = returnValue.Count End Function Sub UserName_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles UserNameTextBox.TextChanged MostraMessaggio("") NuovoUtente = Me.UserNameTextBox.Text If CercaNome(NuovoUtente) > 0 Then MostraMessaggio("L'Account scelto gi esistente. Scegliere un nome diverso") End If End Sub La procedura di evento richiama la funzione di verifica CercaNome, che svolge il compito pi importante: restituisce il numero di utenti con nome uguale a quello immesso; ovviamente se il numero 0 il nome immesso pu essere utilizzato. La funzione, richiamata dalla procedura sub, si avvale del metodo FindUsersByName della classe Membership: i nomi sono autoesplicativi, ma in considerazione della loro importanza in Asp.Net invitiamo a leggere lAppendice a pag.92, dove abbiamo abbondato in descrizioni ed esempi tratti dal sito Microsoft. Infine la procedura di evento se il nuovo utente stato trovato richiama la funzione MostraMessaggio, che si pu vedere a pag.126 nei codici completi riportati in Appendice. 3. La seconda verifica viene svolta da particolari controlli che ci mette a disposizione ASP.Net: i Validator Controls (Appendice pag.71): in questo caso controlli <asp:RequiredFieldValidator che si inseriscono in ciascun campo, ad esso collegandolo; vediamo ad esempio il caso della casella in cui deve essere immesso laccount:

sabato 6 luglio 2013 Pag. 35 / 151

SVILUPPARE UN SITO WEB ASP.NET

<asp:TextBox ID="UserNameTextBox" runat="server" OnLostFocus="UserName_LostFocus" Width="170px" AutoPostBack="True"></asp:TextBox> <asp:RequiredFieldValidator ID="UserNameRequired" runat="server" ControlToValidate="UserNameTextBox" ErrorMessage="Il Nome di Account obbligatorio" ToolTip="Il Nome di Account obbligatorio.">*</asp:RequiredFieldValidator> nel momento che il server processa la casella di testo, se in questa non stato inserito nessun dato mostra un asterisco ed un avviso, che viene gestito dal controllo <asp:ValidationSummary, fermando la registrazione. 4. La terza verifica viene svolta da controlli di Convalida <asp:RegularExpressionValidator o <asp:CompareValidator che vengono pure inseriti nella pagina; vediamo ad esempio quello del controllo della password: <asp:RegularExpressionValidator ID="revPasswordTextBox" runat="server" ControlToValidate="PasswordTextBox" ValidationExpression="^[A-Za-z09]{8,16}" Display="None" ErrorMessage="- La Password deve essere di lunghezza non inferiore a 8 e non superiore a 16 caratteri" /> 5. se vengono rilevati errori durante le verifiche dei due punti precedenti, dopo aver premuto il pulsante di registrazione i messaggi esplicativi vengono mostrati in un controllo <asp:ValidationSummary posto in calce alla griglia di immissione, e la procedura di registrazione viene interrotta. 6. Se tutte le validazioni sono passate, viene avviata la registrazione, gestita dalla procedura OnClick="CreateUser_OnClick", chiamata dal pulsante <asp:Button ID="CreateUser". 7. Questa procedura, attraverso loggetto MembershipUser = Membership.CreateUser, crea nel database il nuovo utente scrivendo nelle tabelle appropriate i dati immessi nella pagina web. Alla fine svolge unulteriore verifica che lutente sia stato effettivamente creato utilizzando la funzione CercaNome che abbiamo visto in precedenza (che ora per deve restituire 1), mostra un messaggio di avviso che lutente stato creato. 8. La procedura, inoltre, richiamando la procedura Sub ID_aDatiAggiunti, che a sua volta richiama Function VerificaID, aggiunge lUserId dellutente appena registrato nella tabella personalizzata DatiAggiunti, per creare cos un record i cui campi saranno in seguito valorizzati. Registrazione utente Attribuzione ad un Ruolo 1. Andiamo ora al secondo passaggio della creazione: lattribuzione ad un ruolo dellutente appena creato. Per questo compito ci occorrono un TextBox ed una DropDownList, questultima associata ad un AccessDataSource, per definire il ruolo da attribuire e liscritto cui attribuirlo, ed un bottone di comando per avviare lattribuzione. 2. il TextBox viene valorizzato con laccount dellutente che abbiamo registrato nel passaggio precedente, aggiungendo alla procedura Sub UserName_LostFocus, che abbiamo visto sopra, le seguenti righe, interlineate nel costrutto if: Else Me.UltimoUtente.Text = NuovoUtente 3. La DropDownList estrae i nomi dei ruoli dalla tabella predefinita aspnet_roles: <asp:AccessDataSource ID="Access_RuoliEsistenti" runat="server" DataFile="~/mdb-database/ASPNetDB.mdb" SelectCommand="SELECT RoleName FROM [aspnet_Roles]"></asp:AccessDataSource> <asp:DropDownList ID="ListaRuoli" runat="server" DataSourceID="Access_RuoliEsistenti" DataTextField="RoleName" DataValueField="RoleName" Width="175px"></asp:DropDownList> 4. A questo punto inseriamo il pulsante di comando: <asp:Button Text="Aggiungi l'Iscritto al ruolo selezionato" ID="AddUserButton" runat="server" OnClick="AddUserButton_Click" CausesValidation="False" /> 5. il pulsante richiama la procedura sub AddUserButton_Click, che: legge dalla DropDownList il nome del ruolo selezionato legge dal TextBox il nome dellutente
sabato 6 luglio 2013 Pag. 36 / 151

SVILUPPARE UN SITO WEB ASP.NET

attribuisce il ruolo allutente con il metodo (v. Appendice pag.102) Roles.AddUserToRole(UtenteCreato, RuoloDaAssegnare)

Registrazione utente Informazioni aggiuntive 1. Abbiamo chiamato Informazioni aggiuntive quei dati non previsti dal database originario, e per i quali abbiamo creato la tabella DatiAggiunti. Questa tabella gi contiene gli ID di tutti gli utenti, in quanto inseriti al momento del primo passo della registrazione. 2. Sotto al titolo Dati Personali inseriamo un controllo AccessDataSource: <asp:AccessDataSource ID="Personali_Source" runat="server" DataFile="~/mdbdatabase/ASPNetDB.mdb" SelectCommand="SELECT * FROM [DatiAggiunti] ORDER BY UserId DESC" DataSourceMode="DataSet" UpdateCommand="UPDATE [DatiAggiunti] SET [NomeCompleto]=@NomeCompleto, [nazione]=@nazione, [cap]=@cap, [citt]=@citt, [provincia]=@provincia, [indirizzo]=@indirizzo, [telcasa]=@telcasa, [telufficio]=@telufficio, [fax]=@fax, [cellulare]=@cellulare, [sitoweb]=@sitoweb WHERE [UserId]=@UserId"> <UpdateParameters> <asp:Parameter Name="NomeCompleto" Type="String" /> <asp:Parameter Name="nazione" Type="String" /> <asp:Parameter Name="cap" Type="String" /> <asp:Parameter Name="citt" Type="String" /> <asp:Parameter Name="provincia" Type="String" /> <asp:Parameter Name="indirizzo" Type="String" /> <asp:Parameter Name="telcasa" Type="String" /> <asp:Parameter Name="telufficio" Type="String" /> <asp:Parameter Name="fax" Type="String" /> <asp:Parameter Name="cellulare" Type="String" /> <asp:Parameter Name="sitoweb" Type="String" /> </UpdateParameters> </asp:AccessDataSource> la cui funzione quella di mettere a disposizione di controlli per la visualizzazione e lediting di dati un collegamento alla tabella DatiAggiunti. Come vedremo nei prossimi passaggi, per la validazione dei campi del database non ci limiteremo ad utilizzare i controlli predefiniti del DetailsView (i BoundField), che racchiudono in s tutte le funzionalit di accesso alla base dati, ma personalizzeremo alcuni di essi con i TemplateField, che sono in pratica raggruppamenti di normali controlli non collegati direttamente alla base dati: per implementare il collegamento, pertanto, occorre parametrizzare l AccessDataSource, come fatto qui sopra, ed inserire delle funzioni di binding, come vedremo a breve. 3. Quindi, per mostrare i dati a schermo e consentirne lediting, inseriamo un controllo DetailsView, che ha la caratteristica di mostrare una colonna con tutti i campi del record che interessa: avendo impostato lordine discendente sul campo chiave UserId verr visualizzato lultimo utente prima dellinserimento del nuovo, vedremo in seguito come aggiornare la vista. Limpostazione delle principali propriet del controllo dovr e ssere il seguente: ID="Details_Nuovi" DataSourceID="GridSource" DataKeyNames="UserId" AutoGenerateRows="False" d un id univoco e descrittivo Imposta il collegamento allAccessDataSource inserito in precedenza come fonte dei dati Imposta il nome del campo di chiave primaria della tabella di origine Impedisce che il controllo generi automaticamente i campi da visualizzare: li inseriremo manualmente nei passi successivi, per averne una gestione pi personalizzabile

4. Nella finestra Propriet di VWD disattiviamo le impostazioni di paginazione (in particolare impostiamo su false la propriet AllowPaging), in quanto per lo scopo che ci proponiamo occorre visualizzare solo il record dellultimo iscritto, con i datti tutti in una pagina. 5. Passiamo in visualizzazione Progettazione; dal menu contestuale che si apre facendo click sulla piccola freccia in alto a destra del controllo scegliamo Modifica colonne; da Campi disponibili aggiungiamo a Campi selezionati quelli necessari per visualizzare tutti i campi della tabella ed i comandi che ci occorrono, come da prospetto seguente, poi nel riquadro a destra di ciascuno attribuiamo le propriet specificate:
sabato 6 luglio 2013 Pag. 37 / 151

SVILUPPARE UN SITO WEB ASP.NET

Campi del database


Tipo Campo BoundField BoundField BoundField BoundField BoundField BoundField BoundField BoundField BoundField BoundField BoundField BoundField Nome Campo (DataField) UserId NomeCompleto nazione cap citt provincia indirizzo telcasa telufficio fax cellulare sitoweb Intestazione Colonna (HaederText) Note ReadOnly si Da trasformare in TemplateField

ID Nr. Cognome e Nome Nazione C.A.P. Citt Provincia Indirizzo Tel.Casa Tel.Ufficio Fax Cellulare Sito Web

si

si si si si si

Per ciascun campo otterremo una definizione con la seguente sintassi: <asp:BoundField DataField="UserId" HeaderText="ID Nr." ReadOnly="True" ControlStyle-Width="170"> poich nella loro forma di default non possibile laccesso diretto ai controlli interni della DetailsView contenenti i comandi o i dati, per consentirne ad esempio la validazione prima della registrazione delle modifiche, occorrer cambiarli in TemplateField (Appendice pag.91). Pertanto, per i controlli indicati nella sovrastante tabella, nella stessa finestra Modifica campi, facciamo click in basso a destra su Converti il campo in un TemplateField. Al posto del tag <asp:CommandField verr generato un tag <asp:TemplateField, con al suo interno i controlli che sostituiscono il BoundField; vediamo un esempio, comprensivo della validazione: <asp:TemplateField HeaderText="Cognome e Nome"> <ItemTemplate> <asp:Label ID="LblIscritto" runat="server" Text='<%# Bind("NomeCompleto") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditIscritto" runat="server" Text='<%# Bind("NomeCompleto") %>'></asp:TextBox> <asp:RequiredFieldValidator ID="rfvEditIscritto" ControlToValidate="TxtEditIscritto" runat="server" ErrorMessage="Iscritto: il campo non pu essere vuoto" Display="None" /> </EditItemTemplate> </asp:TemplateField> Rileviamo: a ) Nel Template creato automaticamente cera anche l a sezione <InsertTemplate>, che abbiamo eliminato perch non utilizzata in questo contesto b ) I BoundField hanno in s la funzionalit di collegamento ai dati: qui occorre implementarla specificamente con la funzione <%# Bind("NomeCompleto") %>, che effettua il binding dal DataSource sottostante. La funzione Bind() in grado di aggiornare la propriet a cui si riferisce con il valore specificato nel controllo in cui utilizzato (mentre la funzione Eval(), che potrebbe anche essere utilizzata nellItemTemplate, pu solo leggere un valore) c ) Sulle validazioni specificate torneremo a breve

sabato 6 luglio 2013 Pag. 38 / 151

SVILUPPARE UN SITO WEB ASP.NET

Comandi (v. Appendice pag.91)


CommandField Modifica, Aggiorna, Annulla In questo contesto ci occorre solo questo pulsante (ricordiamo che i record per ogni utente nella tabella gi esistono, in quanto abbiamo valorizzato il campo UserID al momento della registrazione delliscritto). Allapertura la DetailsView si apre in modalit di lettura, e mostra il pulsante Modifica; facendo click su questo si entra in modalit editing, e mostra i pulsanti Aggiorna (con cui si registrano le informazioni inserite) ed Annulla (con cui si torna alla modalit di lettura)

Validazione dei campi La validazione necessaria sia per verificare formattazioni specifiche, sia perch se inseriamo in un campo un valore che Access non accetta (ad esempio inseriamo un valore stringa in un campo data), la nostra pagina non ci d alcun avviso, ed il database non viene aggiornato. Per implementare la verifica anche qui facciamo ricorso ai Validator Controls. Elenchiamo le convalide che abbiamo impostato:
Nome Campo NomeComplet o cap Verifiche necessarie Controlli da utilizzare

Non pu essere vuoto Pu essere lasciato vuoto, ma se valorizzato deve avere cinque caratteri numerici Tel. Casa: Pu essere lasciato vuoto, ma se inserito deve avere 8 caratteri numerici, di cui il primo deve essere 0 Pu essere lasciato vuoto, ma se valorizzato deve avere almeno 5 caratteri numerici, di cui il primo deve essere 0 Pu essere lasciato vuoto, ma se valorizzato deve avere almeno 8 caratteri numerici, di cui il primo deve essere 3 Pu essere lasciato vuoto, ma se valorizzato deve iniziare con http:// o con http://www.

RequiredFieldValidator RegularExpressionValidator RegularExpressionValidator

telcasa

telufficio

RegularExpressionValidator

cellulare

RegularExpressionValidator

sitoweb

RegularExpressionValidator

Rinviamo al codice in Appendice per vedere in che modo le singole validazioni sono implementate. Qui precisiamo solo che alla fine dei tag DetailsView (ma la collocazione non importante), inseriamo un controllo ValidationSummary, che presenta la caratteristica di rendersi visibile soltanto se si verificano degli errori da mostrare: <asp:ValidationSummary ID="ErroriPersonalizzazioni" runat="server" HeaderText=" Errori nell'immissione dei dati personalizzati:" ShowSummary="True" Width="220px" BorderStyle="Solid" BorderWidth="2" BorderColor="#0066FF" BackColor="#CCCCCC" ValidationGroup="Personalizzazioni" /> Poich nella pagina gi esistono altri controlli di validazione, nelle sezioni che abbiamo costruito in precedenza, inseriamo la propriet ValidationGroup="Personalizzazioni" sia nel ValidationSummary che in ciascun controllo di validazione di Informazioni Aggiuntive; analogamente inseriamo la propriet ValidationGroup="Registrazione" in ciascun controllo di validazione e nel Summary di Informazioni di base: se si impostano i gruppi, la validazione viene limitata solo ai controlli di convalida all'interno del gruppo specificato, quando il controllo attiva un postback al server. 6. Ancora un compito da svolgere laggiornamento run time della DetailsView: infatti questa viene popolata al caricamento della pagina, quindi non comprende ancora lutente che abbiamo immesso al primo passaggio della registrazione, che invece proprio quello che ci serve.
sabato 6 luglio 2013 Pag. 39 / 151

SVILUPPARE UN SITO WEB ASP.NET

7. Il momento in cui fare laggiornamento quello immediatamente successivo alla registrazione dei dati di base ad allaggiunta alla tabella DatiAggiunti del record con lID del nuovo iscritto, quindi come ultima azione della procedura Public Sub CreateUser_OnClick. Qui ci limitiamo ad inserire una chiamata alla procedura sub Aggiorna_Details(). 8. Questa procedura semplicissima, contiene un Me.Details_Nuovi.DataBind(), che reinterroga la fone dei dati. Creazione di un nuovo Ruolo / Eliminazione di un ruolo esistente 1. In primo luogo implementiamo la creazione. In una struttura tabellare simile alle precedenti, inseriamo una GridView, <asp:GridView ID="GridRuoli", che visualizza i ruoli esistenti, collegandola allo stesso AccessDataSource che abbiamo utilizzato nel passaggio relativo allattribuzione di un ruolo ad un utente (DataSourceID="Access_RuoliEsistenti"). Nella costruzione del controllo inseriamo anche un pulsante Seleziona, che ci servir per leliminazione. 2. Quindi inseriamo una casella di testo, con unetichetta descrittiva, in cui digitare il nome del nuovo ruolo, ed un pulsante di comando che avvia la creazione: <asp:TextBox ID="RuoloNuovo" runat="server" Width="170" FontNames="Verdana" Font-Size="12pt" ForeColor="#993300"></asp:TextBox> <asp:Button ID="ConvalidaRuolo" runat="server" OnClick="ConvalidaRuolo_Click" Text="Convalida" /> 3. Il pulsante di comando avvia la procedura di creazione Sub ConvalidaRuolo_Click mediante il metodo Roles.CreateRole(nuovoruolo) (dove nuovoruolo la stringa contenuta nella casella di testo. Tale metodo di Roles (Appendice pag.102) garantisce che il database verr aggiornato congruamente. La procedura comprende inoltre le routine di gestione degli errori e dei messaggi, che saranno mostrati in una <asp:Label ID="MsgNewRole". 4. Ora implementiamo leliminazione. Inseriamo sotto la GridView u n altro pulsante, il cui compito di eliminare il ruolo selezionato nella Grid: <asp:Button ID="Elimina" runat="server" Text="Elimina il Ruolo selezionato" OnClientClick="javascript:return confirm('Il Ruolo verr eliminato.\nConfermi?');" /> 5. questo avvia la procedura di Sub Elimina_Click mediante il metodo Roles.DeleteRole(RuoloDaEliminare) (dove RuoloDaEliminare il nome del ruolo selezionato). Tale metodo crea uneccezione e non cancella il ruolo se questo attribuito a qualche utente. Se invece il ruolo orfano e quindi pu essere cancellato, lelimina senza avvisi: per tal motivo abbiamo previsto un codice client javascript che mostra una finestra modale di Windows per confermare o annullare lazione. Anche qui la procedura comprende le routine di gestione degli errori e dei messaggi, che saranno mostrati in una <asp:Label ID="MsgElimina". cos finita la pagina per la registrazione degli iscritti, che si presenta come segue: solo comando,

sabato 6 luglio 2013 Pag. 40 / 151

SVILUPPARE UN SITO WEB ASP.NET

PANNELLO.ASPX
Questa pagina destinata alla gestione degli iscritti esistenti; presenta strutturalmente molti punti in comune con quella precedente, ma se ne differenzia funzionalmente: a ) Non consente di inserire nuovi utenti b ) Permette modifiche dei dati su tutti gli utenti c ) Consente di eliminare gli utenti dal database Abbiamo tre sezioni: modifica dei dati, eliminazione degli utenti, modifica dei ruoli Partiamo dal web form precedente, per cui: 1. 2. Copiamo tutto il codice di autorizzazioni.aspx in pannello.aspx Eliminiamo tutto il contenuto allinterno di <div id="principale_largo">, al cui interno, sempre attraverso <div, creiamo i box sovrapposti, ciascuno per una delle sezioni della pagina, ed allinterno del primo box due box affiancati: quello di sinistra per la GridView di visualizzazione, quello di destra per la DetailsView di gestione. Inseriamo quindi lintestazione con i rimandi alle sezioni, ed i titoli delle sezioni: il risultato sar un layout di struttura analogo alla pagina precedente. Sezione Modifica dati Utenti In questa sezione utilizzeremo per i dati due controlli: un GridView per visualizzare in ununica lista tutti gli iscritti, con pochi campi pi significativi, ed un DetailsView, che si apre con la selezione di un iscritto sul GridView, mostrando tutti i campi delliscritto, per la visualizzazione e lintervent o sui dati. Impostazione della GridView di visualizzazione 1. Inseriamo un controllo AccessDataSource, di cui modifichiamo le propriet fondamentali, in modo che risultino come dalla tabella seguente: ID="Grid_Source" datasourcemode="DataSet" datafile="~/mdb-database/ASPNetDB.mdb"> SelectCommand="SELECT *FROM [SpecIscritti]> d un id univoco e descrittivo Consente la modifica dei dati connette al database di origine istruzione SQL con cui si imposta la tabella di origine (FROM) e si recuperano tutti i record di tutti i campi (*) dalla query SpecIscritti, che comprende sia i campi di default del database, sia quelli della tabella personalizzata che abbiamo aggiunto

3.

sabato 6 luglio 2013 Pag. 41 / 151

SVILUPPARE UN SITO WEB ASP.NET

2. Inseriamo un controllo GridView cui attribuiamo lID="GridView_Pannello" ed il riferimento alla fonte DataSourceID="Grid_Source" 3. Passiamo in visualizzazione Progettazione; dal menu contestuale che si apre facendo click sulla piccola freccia in alto a destra del controllo scegliamo Modifica colonne; da Campi disponibili aggiungiamo a Campi selezionati tutti quelli necessari per visualizzare i campi pi significativi, come da prospetto seguente, poi nel riquadro a destra di ciascuno attribuiamo le propriet specificate: Campi del database
Tipo Campo Nome Campo (DataField) BoundField BoundField CheckBoxField BoundField BoundField UserId NomeCompleto IsApproved UserName dataiscrizione Intestazione Colonna (HaederText) Formato (DataFormat String) ReadOnly ReadOnly Note

Nr. Iscritto IsApproved? Account Data di Iscrizione

ReadOnly

{0:d}

ReadOnly Formato data breve

Comandi sul database (v. Appendice pag.91)


CommandField Seleziona Nella griglia ci occorre soltanto il pulsante di selezione, che poi imposteremo per aprire la DetailsView

Impostazione della DetailsView di modifica La prima decisione da prendere se attribuire lorigine dati di questo controllo alla stessa origine della GridView o ad unorigine autonoma. La prima soluzione sarebbe quella pi semplice: basterebbe mettere come DataSourceID della Details lID della Grid, ed i due controlli sarebbero automaticamente sincronizzati. Tale soluzione per poco flessibile. Ed allora scegliamo la seconda soluzione, anche se ci comporta pi lavoro. Non prevediamo qui leliminazione degli ute nti perch, per evitare di violare le regole di integrit referenziale interne al database, preferibile sviluppare una sezione apposita. 1. Creiamo un nuovo AccessDataSource con le seguenti caratteristiche: ID="Details_Source" datasourcemode="DataSet" datafile="~/mdb-database/ASPNetDB.mdb"> SelectCommand="SELECT * FROM [SpecIscritti] WHERE [UserId] = @UserId" d un id univoco e descrittivo Consente la modifica dei dati connette al database di origine istruzione SQL con cui si imposta la tabella di origine (FROM) e si recuperano solo i record che hanno il campo UserId uguale al parametro @UserId. Imposta lambito di applicazione del comando Update (modifica record)

UpdateCommand="UPDATE [SpecIscritti] SET [UserName]=@UserName, [NomeCompleto]=@NomeCompleto, [RoleName]=@RoleName, [IsApproved]=@IsApproved, [CreateDate]=@CreateDate, [LastLoginDate]=@LastLoginDate, [PasswordQuestion]=@PasswordQuestion, [PasswordAnswer]=@PasswordAnswer, [Email]=@Email, [nazione]=@nazione, [cap]=@cap, [citt]=@citt, [provincia]=@provincia, [indirizzo]=@indirizzo, [telcasa]=@telcasa, [telufficio]=@telufficio, [fax]=@fax, [cellulare]=@cellulare, [sitoweb]=@sitoweb WHERE [UserId]=@UserId" >

Nella definizione delle istruzioni Command sopra riportate applichiamo i parametri, che sono controlli che consentono di impostare lorigine di alcune informazioni dallesterno del controllo che li
sabato 6 luglio 2013 Pag. 42 / 151

SVILUPPARE UN SITO WEB ASP.NET

richiama. Quindi allinterno del tag <asp:AccessDataSource ci deve essere una sezione di parametri per ciascuno dei controlli chiamanti; avremo pertanto le sezioni: <SelectParameters>...</SelectParameters> <UpdateParameters>...</UpdateParameters> 2. Allinterno di ogni sezione si impostano il tipo di parametro e le definizioni. Pertanto per il SelectCommand sar: <asp:ControlParameter ControlID="GridView_Pannello" Name="UserId" PropertyName="SelectedValue" Type="Int32" /> che comporta le seguenti operazioni: quando il SelectCommand richiama il parametro attraverso listruzione WHERE [UserId] = @UserId, lID viene cercato in un controllo presente nella pagina (ControlParameter), lo specifico controllo viene identificato dal suo id (ControlID="GridView_Pannello"), il campo (UserId) prelevato da quello che allinterno della GridView risulta selezionato (PropertyName="SelectedValue"). 3. Gli altri Command, poich operano allinterno dello stesso controllo da cui devono prelevare le informazioni (DetailsView, per linserimento ed aggiornamento dei dati), hanno un tipo generico, con la seguente forma: <asp:Parameter Name="NomeCompleto" Type="String" /> e cos via per ogni campo del database (indicando ovviamente il Type="" appropriato). Da notare che nellInsertCommand non abbiamo definito i parametri per i campi che non prevediamo di aggiornare tramite il pannello (UserId, RoleName, CreateDate). 4.

DetailsView (Appendice pag.90); nelle Propriet impostiamo su false AutoGenerateRows, e in visualizzazione Progettazione, facendo click sulla piccola
Inseriamo un controllo freccia a destra del controllo e scegliendo Modifica Campi lo popoliamo con tutti i campi del database. Campi del database
Tipo Campo Nome Campo (DataField) BoundField BoundField BoundField BoundField CheckBoxField BoundField BoundField BoundField BoundField BoundField BoundField BoundField BoundField BoundField BoundField BoundField BoundField BoundField BoundField BoundField UserId UserName NomeCompleto RoleName IsApproved CreateDate LastLoginDate PasswordQuestion PasswordAnswer email nazione cap citt provincia indirizzo telcasa telufficio fax cellulare sitoweb Intestazione Colonna (HaederText) Formato (DataFormat String) ReadOnly Note

ID Nr. Account Cognome e Nome Ruolo IsApproved? Data di Iscrizione Ultimo accesso Domanda di Sicurezza Risposta e-mail Nazione C.A.P. Citt Provincia Indirizzo Tel. Casa Tel. Ufficio Fax Cellulare Sito Web
sabato 6 luglio 2013 Pag. 43 / 151

ReadOnly

{0:d} {0:d}

ReadOnly Formato data breve ReadOnly Formato data breve

SVILUPPARE UN SITO WEB ASP.NET

Per ciascun campo otterremo una definizione con la seguente sintassi: <asp:BoundField DataField="NomeCompleto" HeaderText="Iscritto" /> Torneremo pi tardi su questo punto: poich nella loro forma di default non possibile laccesso diretto ai singoli controlli della DetailsView contenenti i comandi o i dati, per consentirne ad esempio la validazione prima della registrazione delle modifiche occorrer cambiarli in TemplateField (vedere in Appendice pag.91); ma per ora continuiamo cos. 5. Dalla stessa finestra Modifica campi inseriamo anche i comandi che ci servono nel controllo Details: Comandi sul database
CommandField Modifica, Aggiorna, Annulla In modalit visualizzazione la DetailsView mostra solo il comando Modifica; facendo click su questo, Modifica viene nascosto ed appaiono Aggiorna (per confermare le modifiche) ed Annulla

Completamento per le operazioni di modifica 1. Completiamo linterfaccia inserendo lultimo controllo che abbiamo previsto, una Label sopra alla DetailsView che fa da titolo a questa, modificandosi secondo il contesto: <asp:Label ID="LabelSelezionato" runat="server" Text="Scheda Iscritto" Visible="False"></asp:Label> 2. Quindi in VWD portiamo in primo piano la finestra di pannello.apsx.vb e scriviamo le seguenti routine: Funzione che estrae dalla GridView il nome dellIscritto selezionato: Public Function IscrittoSelezionato() As String Dim RecordSelezionato As GridViewRow = GridView_Pannello.SelectedRow IscrittoSelezionato = RecordSelezionato.Cells(2).Text End Function Routine di evento che, quando si compie una selezione su Gridview, mostra la label con il nome dellIscritto selezionato: Protected Sub GridView_Pannello_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles LabelSelezionato.Visible = "true" LabelSelezionato.Text = "Scheda di " & IscrittoSelezionato() End Sub Routine di evento che, quando cambia lo stato di DetailsView, cambia il testo della Label: Protected Sub Details_Pannello_ModeChanged(ByVal sender As Object, ByVal e As System.EventArgs) If Details_Pannello.Visible = "true" Then Select Case Details_Pannello.CurrentMode Case DetailsViewMode.Edit LabelSelezionato.Visible = "true" LabelSelezionato.Text = "Modalit modifica - " & IscrittoSelezionato() End Select ElseIf Details_Pannello.Visible = "false" Then LabelSelezionato.Visible = "false" End If End Sub

3. A questo punto, se inseriamo i dati di un iscritto esistente, ci accorgeremmo che la GridView non rispecchia le modifiche. Ci occorrono allora delle routine di evento che, al verificarsi delle modifiche in DetailsView aggiornino anche il GridView; si applica a tale scopo il metodo DataBind(), che interroga lorigine dei dati estraendo il valore della propriet: Protected Sub Details_Pannello_ItemUpdated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewUpdatedEventArgs) GridView_Pannello.DataBind() End Sub 4. Per manca ancora qualcosa perch il tutto funzioni: il codice degli eventi dei controlli si attiva soltanto se viene richiamato allinterno dei tag dei controllo stessi; pertanto dovremo inserire : in GridView: OnSelectedIndexChanged="GridView_Pannello_SelectedIndexChanged" in DetailsView: OnModeChanged="Details_Pannello_ModeChanged"
sabato 6 luglio 2013 Pag. 44 / 151

SVILUPPARE UN SITO WEB ASP.NET

OnItemUpdated="Details_Pannello_ItemUpdated" Validazione dei campi C tuttavia ancora un problema che dobbiamo risolvere. Se a questo punto modifichiamo un iscritto o inseriamo un nuovo iscritto inserendo in un campo un valore che Access non accetta (ad esempio inseriamo un valore stringa in un campo data), la nostra pagina non ci d alcun avviso, ed il database non viene aggiornato. Per implementare la verifica occorre far ricorso a particolari controlli che ci mette a disposizione ASP.Net: i Validator Controls (Appendice pag.71). Poich per, come abbiamo visto in precedenza, nella loro forma di default non possibile laccesso diretto ai singoli controlli della DetailsView, occorre prima trasformare i campi dati che opportuno convalidare in TemplateFields. Prima di procedere, quindi, programmiamo quali campi sono da verificare e con quali modalit dovranno essere convalidati:
Nome Campo NomeCompleto UserName email Intestaz. Verifiche necessarie Non pu essere vuoto Non pu essere vuoto Deve avere tra 6 e 12 caratteri alfabetici Pu essere lasciato vuoto, ma se valorizzato deve avere un formato e-mail valido Pu essere lasciato vuoto, ma se valorizzato deve avere cinque caratteri numerici Tel. Casa: Pu essere lasciato vuoto, ma se inserito deve avere 8 caratteri numerici, di cui il primo deve essere 0 Pu essere lasciato vuoto, ma se valorizzato deve avere almeno 5 caratteri numerici, di cui il primo deve essere 0 Pu essere lasciato vuoto, ma se valorizzato deve avere almeno 8 caratteri numerici, di cui il primo deve essere 3 Pu essere lasciato vuoto, ma se valorizzato deve iniziare con http:// o con http://www. Controlli da utilizzare RequiredFieldValidator RequiredFieldValidator RegularExpressionValidator RegularExpressionValidator

Iscritto Account e-mail

nazione cap

Nazione C.A.P.

RegularExpressionValidator

telcasa

Tel. Casa

RegularExpressionValidator

telufficio

Tel. Ufficio

RegularExpressionValidator

cellulare

Cellulare

RegularExpressionValidator

sitoweb

Sito Web

RegularExpressionValidator

Ed ora procediamo con le nostre operazioni. 1. in VWD nella finestra di pannello.aspx passiamo alla visualizzazione Progettazione, evidenziamo il controllo DetailsView, clicchiamo sulla freccetta in alto a destra ( ), clicchiamo su Modifica campi, e quindi in sequenza selezioniamo ciascuno dei campi che sopra abbiamo spuntato con

e facciamo click su Converti il campo in un TemplateField.

Se verifichiamo la pagina nel browser non riscontriamo alcuna differenza, ed anche se proviamo a modificare un record il comportamento resta invariato. Passiamo per in visualizzazione Origine, e notiamo che ogni tag <asp:BoundField relativo ai campi che abbiamo convertito si trasformato in un gruppo di TemplateField, come il seguente: <asp:TemplateField HeaderText="Iscritto"> <ItemTemplate> <asp:Label ID="LblIscritto" runat="server" Text='<%# Bind("NomeCompleto") %>'></asp:Label> </ItemTemplate>
sabato 6 luglio 2013 Pag. 45 / 151

SVILUPPARE UN SITO WEB ASP.NET

<EditItemTemplate> <asp:TextBox ID="TxtEditIscritto" runat="server" Text='<%# Bind("NomeCompleto") %>'></asp:TextBox> </EditItemTemplate> <InsertItemTemplate> <asp:TextBox ID="TxtInsIscritto" runat="server" Text='<%# Bind("NomeCompleto") %>'></asp:TextBox> </InsertItemTemplate> </asp:TemplateField> Dove allinterno del gruppo ci sono tre template diversi, uno per ciascuno stato gestito, ovvero EditItemTemplate, InsertItemTemplate e ItemTemplate rispettivamente per la modifica, l'inserimento e la visualizzazione. Da rilevare inoltre il codice di collegamento ai dati <%# Bind("NomeCompleto") %>, che effettua il binding dal DataSource sottostante. La funzione Bind() in grado di aggiornare la propriet a cui si riferisce con il valore specificato nel controllo in cui utilizzato, mentre la funzione Eval(), che potrebbe anche essere utilizzata nellItemTemplate, pu solo leggere un valore. 2. Prima di inserire i controlli per la validazione delle immissioni, occorre prendere unaltra decisione: vogliamo che appaia un messaggio di errore per ogni campo errato o un messaggio che mostri una lista con tutti gli errori? Decidiamo di adottare la seconda soluzione, perch restituisce una pagina pi pulita ed comunque esplicativa. Pertanto in tutti i Validator Controls che andremo ad immettere imposteremo la propriet Display su None, ed ora 3. subito dopo letichetta che precede la DetailsView, inseriamo un controllo ValidationSummary, che presenta la caratteristica di rendersi visibile soltanto se deve mostrare degli errori: <asp:ValidationSummary ID="SommarioErrori" runat="server" HeaderText="Errori nell'immissione dei dati:" ShowSummary="True" Width="220px" BorderStyle="Solid" BorderWidth="2" BorderColor="#0066FF" BackColor="#CCCCCC" /> 4. Inseriamo ora i Validator Controls che abbiamo programmato per i singoli campi, allinterno dellItemTemplate (Edit ed Insert) di ogni campo. Abbiamo fatto abbondante ricorso ai controlli RegularExpressionValidator, che danno ampia possibilit di personalizzazione, anche se implicano un lavoro intenso e anche noioso di costruzione delle stringhe. Ne riportiamo un esempio: <asp:RegularExpressionValidator ID="revTxtEditSitoWeb" runat="server" ControlToValidate="TxtEditSitoWeb" ValidationExpression="^http:\/\/(www\.)?[a-zA-Z0-9-]{3,}\.[a-zAZ]{2,}(\/)?$" Display="None" ErrorMessage="Sito Web: Pu essere lasciato vuoto, ma se inserito deve iniziare con http:// o con http://www." /> Comunque il codice completo della pagina (e quello di tutte le pagine del nostro Sito Prove) riportato in Appendice. In Appendice, a pag.75, ci dilunghiamo abbastanza sulle Espressioni Regolari, in modo da consentirne la comprensione e la costruzione sintattica, e riportiamo riferimenti per lapprofondimento. Sezione Eliminazione Utenti 1. Qui ci servono: una DropDownList da cui selezionare lutente da eliminare, un TextBox in cui venga evidenziato lutente selezionato ed un pulsante di comando per avviare leliminazione. 2. In primo luogo nel database ci creiamo una query, che chiamiamo IscrittiIdAccount, che per ogni utente recuperi solo lId ed il nome dellaccount, che avr la seguente struttura SQL:

SELECT aspnet_Users.UserId, aspnet_Users.UserName FROM aspnet_Users;


3. Inseriamo quindi un controllo AccessDataSource ed un controllo DropDownList, da cui scegliere il nome dellaccount da eliminare: <asp:AccessDataSource ID="Source_Iscritti" runat="server" DataFile="~/mdbdatabase/ASPNetDB.mdb" SelectCommand="SELECT * FROM [IscrittiIdAccount]"></asp:AccessDataSource> <asp:DropDownList ID="ListaIscritti" runat="server" DataSourceID="Source_Iscritti" OnSelectedIndexChanged="ListaIscritti_SelectedIndexChanged"
sabato 6 luglio 2013 Pag. 46 / 151

SVILUPPARE UN SITO WEB ASP.NET

DataTextField="UserName" DataValueField="UserName" Width="100px" AutoPostBack="True"> </asp:DropDownList> 4. inseriamo una casella di testo che mostra il nome dellaccount selezionato, attraverso la procedura ListaIscritti_SelectedIndexChanged, sia per verifica della selezione che quale fonte della procedura di eliminazione <asp:TextBox ID="TextScelto" runat="server" Width="100px" ForeColor="Red" AutoPostBack="False"></asp:TextBox> 5. infine inseriamo due pulsanti Annulla ed Elimina Utente: <asp:Button ID="ButtonAnnulla" runat="server" Text="Annulla" OnClick="ButtonAnnulla_Click" />&nbsp;&nbsp;&nbsp;&nbsp; <asp:Button ID="ButtonElimina" runat="server" Text="Elimina Utente" OnClick="ButtonElimina_Click" /> 6. la procedura richiamata dal primo si limita ad azzerare il contenuto della casella di testo Protected Sub ButtonAnnulla_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonAnnulla.Click Me.TextScelto.Text = "" End Sub 7. la procedura richiamata dal secondo pulsante si occupa delleliminazione dellutent e dal database (riportiamo qui solo gli elementi principali del codice, vedere in Appendice pag.137 le routine complete): la routine Public Sub ButtonElimina_Click richiama la due procedure che provvedono al compito principale, leliminazione dalle tabelle di default e dalla tabella personalizzata, ed aggiorna i dati a schermo:

Public Sub ButtonElimina_Click(ByVal sender As Object, ByVal args As System.EventArgs) Handles ButtonElimina.Click EliminaPredefiniti(Ut_DaEliminare) EliminaPersonalizzati(Id_DaEliminare) ListaIscritti.DataBind() GridView_Pannello.DataBind() Me.TextUtenteScelto.Text = "" Me.TextIDScelto.Text = "" Me.MsgEliminato.Text = "L'iscritto " & Id_DaEliminare & " - " & Ut_DaEliminare & " stato eliminato dal database" End Sub Da notare che le variabili Ut_DaEliminare e Id_DaEliminare sono state dichiarate come variabili di classe Public Shared, perch mantengano i valori dopo la loro valorizzazione, che
avviene al momento della selezione, attraverso ListaIscritti_SelectedIndexChanged la routine Public Sub EliminaPredefiniti utilizza il metodo Membership.DeleteUser, integrato in Asp.Net la routine Public Sub EliminaPersonalizzati mediante una stringa sql DELETE FROM utilizza un comando OleDbCommand

Sezione Modifica assegnazione ruoli 1. per lattribuzione ad un ruolo degli iscritti che non ne hanno, con una procedura simile a quella che abbiamo visto per la pagina precedente relativamente ai nuovi utenti, prevediamo due DropDownList, una che lista i ruoli esistenti, una che lista gli utenti senza ruolo, ciascuno collegato ad un AccessDataSource: dopo la selezione da entrambe le liste, si preme il pulsante che crea lassegnazione applicando il metodo Roles.AddUserToRole. 2. per eliminare lattribuzione di un ruolo ad un iscritto, occorre innanzitutto creare nel database una query che estrae solo gli utenti con ruolo, che chiamiamo IscrittiConRuolo. Quindi un DropDownList, collegato tramite AccessDataSource a quella query, che lista solo gli utenti con ruolo; selezionando un utente, nella successiva TextBox viene mostrato il ruolo assegnato a quellutente, attraverso la procedura ListaUtentiRuoli_SelectedIndexChanged, ed alla fine premendo il pulsante si elimina lassegnazione applicando il metodo Roles.RemoveUserFromRole. Non ci siamo soffermati su questi ultimi passaggi perch abbiamo applicato controlli e procedure che gi abbiamo visto in precedenza. comunque utile esaminare i listati anche per vedere le soluzioni adottate nel codice VB per gestire le varie problematiche che si sono presentate.
sabato 6 luglio 2013 Pag. 47 / 151

SVILUPPARE UN SITO WEB ASP.NET

Finalmente la pagina completa e pienamente funzionale, e la possiamo testare nel browser:

sabato 6 luglio 2013 Pag. 48 / 151

SVILUPPARE UN SITO WEB ASP.NET

A questo punto abbiamo terminato lArea Amministratore, e passiamo alle pagine riservate agli Iscritti.

sabato 6 luglio 2013 Pag. 49 / 151

SVILUPPARE UN SITO WEB ASP.NET

3. AREA I SCRITTI
Dobbiamo innanzi tutto definire la tipologia di pagine che saranno utilizzate per mostrare i contenuti fruibili dagli Iscritti, in base ai quali progettare il layout pi funzionale. Pensiamo pertanto alla prima pagina e ad alcune altre con contenuti vari di scritti ed immagini (1), una pagina che gestisce documenti Word ed una che gestisce documenti Excel (2); quindi per le prime va bene la struttura a tre colonne, che gi abbiamo utilizzato nelle altre aree del sito, per le ultime due sembrerebbero migliori layout a due colonne. La struttura delle tipologie di pagine (1), pertanto, dovrebbe essere la seguente:

Intestazione del sito


Area corrente

Menu di navigazione

Pie di pagina
Mentre quella delle pagine (2) dovrebbe essere la seguente:

Intestazione del sito

Area corrente

Menu di navigazione

Pie di pagina
sabato 6 luglio 2013 Pag. 50 / 151

SVILUPPARE UN SITO WEB ASP.NET

Quindi abbiamo delle zone in cui il layout ed i contenuti cambiano a seconda delle pagine (quelle con il bordo rosso) ed altre in cui il layout e parte dei contenuti restano fissi. Attraverso la funzionalit di Asp.Net di Pagine Master e Pagine Content (vedere Appendice, pagg.68 e seguenti) possibile creare degli schemi fissi che ogni pagina .aspx poi si limiter a riempire con i propri contenuti specifici. Creeremo pertanto una pagina master principale (Prim_Iscritti.master) con tutte le impostazioni comuni: se le differenze tra le due tipologie fossero pi consistenti, dovremmo creare una pagina master secondaria per ogni situazione in cui occorrono le impostazioni specifiche (le normali pagine di contenuti (1) e le pagine che incorporano documenti (2)); poich per noi lunica differenza che nella seconda tipologia manca la terza colonna e che la seconda colonna occupa anche lo spazio della terza, sufficiente approfittare di una caratteristica delle pagine master: se un segnaposto definito ( ContentPlaceHolder) non viene richiamato dalla pagina dei contenuti, per questa come se non esistesse (a meno che non sia previsto testo alternativo, come detto in Appendice). Nota: sarebbe stato pi logico applicare il sistema di Master/Content a tutto il sito, e non solo allarea Iscritti, perch di fatto molte delle impostazioni di layout si ripetono in tutta lapplicazione; abbiamo per preferito, per motivi didattici (chiarez za espositiva e di lettura del codice) non introdurre prima il concetto, soprattutto quando cerano da sviluppare pagine pi complesse. Comunque, una volta capito il meccanismo, non difficile creare le master per tutto il sito.

C REARE
1.

LA

P AGINA M ASTER

Nel pannello Esplora soluzioni di VWD posizioniamoci con il mouse sulla cartella private, e dal menu contestuale che si apre cliccando con il tasto destro, oppure dal menu Siti Web, selezioniamo Aggiungi nuovo elemento

2.

Viene mostrata la seguente finestra di dialogo:

sabato 6 luglio 2013 Pag. 51 / 151

SVILUPPARE UN SITO WEB ASP.NET

Selezioniamo tra i modelli Pagina master, inseriamo come nome Prim_Iscritti.master e facciamo click su Aggiungi. 3. Nel pannello a destra di VWD ora appare il nuovo oggetto. La finestra Origine di VWD mostra il codice generato in automatico dal programma:

<%@ Master Language="VB" CodeFile="Prim_Iscritti.master.vb" Inherits="MasterPrincipale" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <asp:ContentPlaceHolder id="head" runat="server"> </asp:ContentPlaceHolder> </head> <body> <form id="form1" runat="server"> <div> <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server"> </asp:ContentPlaceHolder> </div> </form> </body> </html>
4. Come primo passo modifichiamo il codice di Prim_Iscritti.master. Pertanto: colleghiamo il form al foglio di stile base.css inseriamo tutte le intestazioni ed i pi di pagina copiandoli dalla pagina iniziale (dobbiamo solo modificare la riga di avvertimento dellarea corrente) inseriamo una riga in pi per il Menu che svilupperemo subito dopo: per ora mettiamo soltanto una scritta segnaposto inseriamo i segnaposto <asp:ContentPlaceHolder in corrispondenza degli elementi che dovranno essere importati dai form delle pagine dei contenuti attribuiamo agli id nomi pi descrittivi, pi utili per il successivo sviluppo del codice.

INSERIAMO IL MENU
Per implementare un menu di navigazione. ASP.NET 2.0 offre un sistema, basato su controlli di cui quelli per la visualizzazione possono essere i seguenti: Menu, controllo che visualizza la struttura del sito attraverso un menu a tendina personalizzabile. TreeView, controllo che visualizza la struttura del sito in un menu ad albero espandibile. SiteMapPath, controllo che visualizza la posizione corrente dell'utente rispetto alla struttura del sito. Ognuno di questi controlli, come abbiamo detto implementando il menu per lAmministratore, a pag. 26, prevede la presenza della Site Map, una fonte di dati che rappresenti l'intera struttura del sito in questione, rappresentata da uno o pi file .sitemap (che non sono altro che file XML). 1. 2. In questo caso utilizziamo WebIscritti.sitemap che abbiamo predisposto in quelloccasione. Il menu uguale per tutta lArea iscritti, quindi verr posto in questa pagina Prim_Iscritti.master; utilizziamo i controlli SiteMapDataSource e Menu per creare la struttura di navigazione. Se avessimo utilizzato il web control SiteMapPath, non avremmo avuto bisogno di apecificare una fonte dati, perch questo prende come fonte di dati direttamente il web.sitemap di default; il controllo Menu ha bisogno invece di una fonte di dati specificata: a questo scopo viene inserito anche il controllo SiteMapDataSource, che di default cercherebbe anchesso il web.sitemap, ma poich nel web.config abbiamo definito specifici SiteMap Providers, indicando come default il <siteMap defaultProvider="Iscritti", va a cercare WebIscritti.sitemap anche se non lo indichiamo esplicitamente nelle propriet del controllo; quindi colleghiamo il controllo Menu con SiteMapDataSource attraverso la propriet DataSourceID. Il men che risulta il seguente:

sabato 6 luglio 2013 Pag. 52 / 151

SVILUPPARE UN SITO WEB ASP.NET

LE

PAGINE DEI CONTENUTI

(. ASPX )

PAGINE A TRE COLONNE


1. Ora modifichiamo la pagina iscritti_home.aspx per farla diventare una pagina di contenuti da organizzare attraverso la master page. A tal fine sostituiamo tutto il codice iniziale (quello proposto da VWD mostrato a pag.10) con le strutture: <asp:Content ID="Content21" ContentPlaceHolderID= ... </asp:Content> Come si vede dai listati in Appendice, non ci sono pi elementi di layout, che vengono prelevati (tramite i riferimenti ContentPlaceHolderID=) dalla pagina master. Allinterno di quei riferimenti, poi, si possono inserire tag sia per i contenuti che per ulteriori elementi di layout. Da rilevare che si sono impostati gli elementi <div> necessari a creare la struttura; a tal proposito occorre fare delle prove nellambiente di test perch la collocazione dei <div> nella pagina master o nella pagina dei contenuti sortisce effetti diversi. 2. Copiamo il codice di cui sopra nelle pagine Pag1-Pag5.aspx, ed anche queste sono pronte. Ecco un esempio:

sabato 6 luglio 2013 Pag. 53 / 151

SVILUPPARE UN SITO WEB ASP.NET

PAGINE A DUE COLONNE


1. Copiamo lo stesso codice nelle pagine a due colonne (PagExcel.aspx e PagWord.aspx): qui per dobbiamo eliminare il richiamo al ContentPlaceHolderID= che si riferisce alla colonna di destra. 2. Manca ancora una cosa: nel file base.css inseriamo un nuovo ID elemento per la colonna in modo che occupi anche larea lasciata libera dalla colonna di destra, che qui non c. Ecco il risultato prima di sviluppare le singole pagine:

GESTIONE DI DOCUMENTI EXCEL


Per aprire documenti Excel allinterno di pagine Web abbiamo tre possibilit: A ) Salvare il documento, dallinterno di Excel, come p agina web (Htm, Html, Mht): in tal modo potr essere richiamato ed aperto in una pagina web, avendo la possibilit di visualizzarlo solo integralmente, ma senza poter modificare i dati; B ) Salvare il documento, dallinterno di Excel, in formato Xml, che presenta pi o meno le stesse limitazioni del caso precedente; C ) Interagire con il documento in formato nativo Excel Xls, attraverso una connessione ODBC od OleDb attraverso cui si pu accedere al documento o a parti di esso in lettura, sovrascrivere dati, creare nuovi Fogli (Sheets). anche possibile creare documenti Excel ex novo. Alcune limitazioni riguardano la cancellazione di Fogli (vengono svuotati, non eliminati) e limpossibilit di eliminare righe intere. Comunque in rete si trovano tools che, attravers o limplementazione di classi, ampliano queste possibilit: tra essi citiamo ExcelReader. Ovviamente preliminare alla scelta della tecnica la valutazione dei contenuti: perch in quel sito particolare che dobbiamo sviluppare ci occorre un documento Excel? Ci sufficiente visualizzarlo o dobbiamo anche prevederne la possibilit di modifiche? Ci occorre accedere a tutto il documento o solo a parte dei dati in esso contenuti? Per questo motivo, nello sviluppo del nostro SitoProve, e precisamente nella pagina PagExcel.aspx, abbiamo adottato alcune soluzioni che hanno valenza esclusivamente didattica, per mostrarne alcune delle potenzialit e le soluzioni di implementazione, da cui si pu facilmente partire per gli adattamenti ai casi concreti. Creazione del documento Excel 1. Apriamo Excel con un Nuovo Foglio di Lavoro, ed inseriamo alcuni dati congruenti con lapplicazione: abbiamo messo poche righe con UserID ed UserName di alcuni degli Utenti registrati nel database di Access, aggiungendo il campo e-mail
sabato 6 luglio 2013 Pag. 54 / 151

SVILUPPARE UN SITO WEB ASP.NET

alternativa; abbiamo inoltre inserito un gruppo di celle in cui scrivere i pagamenti delle quote associative. 2. Diamo un nome alle celle o a gruppi di esse, in modo da poterle richiamare attraverso il nome anzich attraverso il riferimento. 3. Salviamo il documento nella cartella servizi del sito, nei tre formati che potranno servirci: Excel_Doc.xls, Excel_Doc.xlm, Excel_Doc.mht. 4. Chiudiamo Excel. Il documento ora pronto per essere utilizzato. Visualizzazione del documento completo Torniamo nellambiente di sviluppo VWD ed apriamo la pagina PagExcel.aspx. ci limitiamo ad inserire, nella colonna sinistra, un controllo HyperLink: <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="../servizi/Excel_Doc.mht" Target="_self" FontUnderline="True" ForeColor="#0066FF" Font-Size="10">Documento integrale</asp:HyperLink> A parte titoli e formattazione, il lavoro tutto qui; vediamo il risultato. nella pagina chiamante:

pagina chiamata:

sabato 6 luglio 2013 Pag. 55 / 151

SVILUPPARE UN SITO WEB ASP.NET

Visualizzazione di dati estratti dal documento Non seguiremo qui tutti i passi dello sviluppo, come fatto nelle altre pagine del sito, in quanto i concetti sono i medesimi. Mostreremo soltanto come abbiamo ottenuto il risultato attraverso un collegamento OleDb. 1. Per linterfaccia vediamo solo il men di navigazione nei dati Excel che abbiamo costruito, nella colonna destra, attraverso controlli ListBox, RadioButtonList, Button e Label, precisando che i collegamenti sono implementati da controlli AccessDataSource, e la visualizzazione dei dati da GridView:

2. lelenco dei documenti Excel disponibili nel sito viene caricato, allapertura della pagina, con il metodo intrinseco My.Computer.FileSystem.GetFiles, che popola la prima ListBox; 3. dopo la selezione viene visualizzato il Passo 2; in questo la scelta Pagamento Quote mostra la ListBox a destra, che riporta tutti gli account registrati sul database di Access, con le modalit che gi conosciamo: <asp:AccessDataSource ID="DataSourceUtenti" runat="server" DataFile="~/mdb-database/ASPNetDB.mdb" SelectCommand="SELECT UserName FROM [SpecIscritti] WHERE IsApproved = true ORDER BY UserName"></asp:AccessDataSource> <asp:ListBox ID="Step2_2_ListBox_Utenti" runat="server" DataSourceID="DataSourceUtenti" DataTextField="UserName" SelectionMode="Single" ></asp:ListBox> 4. se nel passo 2 si spuntano altre scelte, o se nel box a destra si seleziona un utente, si scatena il collegamento ad Excel e la visualizzazione dei dati nella GridView; 5. il collegamento si imposta attraverso una stringa di connessione, che in questo caso abbiamo costruito nel codice mediante loggetto intrinseco di Asp.Net OleDbConnectionStringBuilder, che sarebbe bene utilizzare sempre al posto delle stringhe concatenate, per motivi di sicurezza del sito: Public Function StringaConnessione(ByVal FileExcel As String) As String Dim builder As New OleDbConnectionStringBuilder() Dim NomePercorsoExcel As String = "~\servizi\" & FileExcel builder.ConnectionString = "Data Source=" & Server.MapPath(NomePercorsoExcel) builder.Add("Provider", "Microsoft.Jet.OLEDB.4.0") builder.Add("Extended Properties", "Excel 8.0") StringaConnessione = builder.ToString End Function 6. lambito dei dati da estrarre di definisce attraverso stringhe SQL , che richiamano intervalli di celle mediante riferimenti o nomi: strSQL strSQL strSQL strSQL strSQL = = = = = "SELECT "SELECT "SELECT "SELECT "SELECT * * * * * FROM FROM FROM FROM FROM GruppoUtenti" " & QuoteUtente [Foglio1$C1:C5]" [Foglio1$C1:D5]" [Foglio1$C2:D3]"

sabato 6 luglio 2013 Pag. 56 / 151

SVILUPPARE UN SITO WEB ASP.NET

7. lestrazione vera e propria ed il popolamento della GridView avvengono attraverso questa sequenza di comandi: Dim ConnExcel As New OleDbConnection(StringaConnessione(NomeConEstensione)) Dim query As OleDbDataAdapter = New OleDbDataAdapter(strSQL, ConnExcel) Dim querydataset As New DataSet() query.Fill(querydataset, 0) Me.Step3_GridExcel.DataSource = querydataset.Tables(0).DefaultView Me.Step3_GridExcel.DataBind() ConnExcel.Close() In cui: ConnExcel query imposta una variabile OleDbConnection oggetto su una nuova istanza di

querydataset query.Fill

imposta una variabile oggetto su una nuova istanza di OleDbDataAdapter, che definisce la specifica connessione con il gruppo di dati da richiamare imposta una variabile oggetto su una nuova istanza di DataSet, che riserva in memoria lo spazio per i dati riempie querydataset con i dati estratti

Le righe successive impostano lorigine dei dati della GridView sul querydataset e ne effettuano il databinding. 8. vediamo la GridView di uno degli output:

sabato 6 luglio 2013 Pag. 57 / 151

SVILUPPARE UN SITO WEB ASP.NET

9. e la pagina completa con un altro output:

COLLEGAMENTI A DOCUMENTI W ORD


Anche qui ci occupiamo della visualizzazione di un documento Word esistente, non della sua creazione lato server (che pure sarebbe possibile, ma che esula dai limiti che ci siamo imposti). MS Word non un database, non pu essere collegato tramite OleDb. Pertanto o richiamiamo lintero documento integralmente, o copiamo parte di esso in un database o in un foglio di lavoro di Excel e ne richiamiamo i contenuti con le tecniche viste in precedenza. Abbiamo utilizzato per gli esempi questo stesso documento che stiamo leggendo, che abbiamo copiato nella cartella servizi del sito, salvandolo anche nei formati mht ed xml. Come per Excel, richiamiamo il documento integrale attraverso un collegamento dalla colonna sinistra della pagina. Per implementare lesempio successivo, abbiamo copiato nel Foglio 2 di Excel il sommario di questo tutorial. Quindi in VWD, utilizzando ed adattando parte del codice della pagina Excel, facciamo in modo che la colonna centrale della pagina Word mostri il sommario.

sabato 6 luglio 2013 Pag. 58 / 151

SVILUPPARE UN SITO WEB ASP.NET

Questo il risultato a schermo:

C ONCLUS I ONE
A questo punto la struttura di base del nostro SitoProve completa. Certamente per situazioni concrete dovranno essere apportati adattamenti, modifiche e miglioramenti: ad esempio, seppur si abbia bisogno di integrazioni con Word ed Excel, questi saranno probabilmente inseriti in pagine comprensive di altri contenuti, e non in pagine distinte. Ma ritengo che lo scopo prefisso, di mettere a disposizione di chi sviluppa un sito in modo non professionale uno strumento che gli consenta di crearne uno con poche modifiche e fornirgli gli strumenti per comprendere le soluzioni adottate mettendolo sulla base di partenza per trovarne altre, sia stato raggiunto. Sono consapevole che, al di l di alcune scelte volutamente adottate per motivi didattici, nel progetto presentato ci possono essere errori e bugs: sar pertanto lieto di ricevere via e-mail feedback di qualunque natura (osservazioni, critiche, suggerimenti correzioni o quantaltro), che senzaltro saranno utili anche a me, in quanto anchio faccio parte del target di utilizzatori cui mi rivolgo: sviluppatori occasionali ed amatoriali .

sabato 6 luglio 2013 Pag. 59 / 151

A P P E N DI CI
I FILE *.CONFIG

DI

R I FE RI M E NT O

Tutte le applicazioni .NET Framework ereditano le impostazioni di configurazione di base e quelle predefinite da un file denominato Machine.config, utilizzato per le impostazioni di configurazione del server. Per alcune di queste impostazioni non possibile eseguire l'override nei file di configurazione presenti a livelli inferiori della gerarchia. Nelle applicazioni client .NET (console e Windows) per eseguire l'override delle impostazioni ereditate vengono utilizzati file di configurazione denominati ApplicationName.config. Per eseguire la medesima operazione, nelle applicazioni ASP.NET vengono utilizzati file di configurazione denominati Web.config. L'elemento principale della gerarchia di configurazione di ASP.NET un file denominato Web.config principale, presente nella stessa directory del file Machine.config. Il file Web.config principale eredita tutte le impostazioni del file Machine.config e contiene impostazioni utilizzabili per tutte le applicazioni ASP.NET che eseguono una versione specifica di .NET Framework. In ogni applicazione ASP.Net oltre al web.config nella root dellapplicazione stessa possibile crearne altri in ciascuna sottocartella. Poich ogni applicazione ASP.NET eredita le impostazioni di configurazione predefinite dal file Web.config principale, necessario creare file Web.config esclusivamente per le impostazioni che devono eseguire l'override di quelle predefinite.

PATH RELATIVE
Nei tag come

href, src etc., che puntano ad una risorsa, possono verificarsi le seguenti ipotesi:
La pagina in cui si trova il tag chiamante nello stesso nodo della risorsa: sufficiente la chiamata diretta, p.e. Default.aspx punta a fissi.css con href="fissi.css"; La risorsa si trova in un sottonodo della pagina chiamante; anche qui la soluzione univoca, sufficiente invocare la path iniziando dal nodo corrente; p.e. Default.aspx punta a logo.jpg con src="servizi/img/logo.jpg"; La risorsa e la pagina chiamante si trovano in nodi diversi rispetto alla root del sito, ad esempio amministra.aspx e logo.jpg; in questo caso ci troviamo di fronte a diverse regole sintattiche tra (X)HTML e ASP.Net.

In (X)HTML Si risale alla root con lelemento sintattico ../ (../ risale di un livello, ../../ risale di due livelli, ../../../ risale di tre livelli, e cos via), seguito dal nome della risorsa; nellesempio indicato al terzo punto si avr src="../servizi/img/logo.jpg". Nello sviluppo in ambiente ASP.Net questa sintassi si applica agli HTML Controls (v. Tipi di Controlli a pag.70). In ASP.Net Quando si utilizzano User Controls o Server Controls bisogna invece ricorrere alla tilde (~, che si ottiene tenendo premuto il tasto Alt e digitando 126 sul tastierino numerico). La tilde punta direttamente alla root del sito, da qualunque livello si parta, per cui deve essere seguita dal percorso della risorsa: nellesempio precedente, la chiamata dovrebbe essere src="~/servizi/img/logo.jpg".

SVILUPPARE UN SITO WEB ASP.NET

Percorso assoluto Poich il problema sorge durante il rendering delle pagine da parte del server, se la pagina contiene sia HTML Control che User Control o Server Control, il flusso del rendering pu non interpretare correttamente le sintassi, causando errori nella visualizzazione. La soluzione pi sicura consiste nel modificare tutti i collegamenti, al momento della pubblicazione del sito, con percorsi assoluti, che non devono essere interpretati dal server. Per esempio, se il sito verr pubblicato nel dominio SitoProve.it, il percorso di cui sopra sar indicato con src="http://www.SitoProve.it/servizi/img/logo.jpg". Un altro modo di utilizzare i percorsi assoluti, gestibili anche in locale in fase di sviluppo, quello di caricare i file delle risorse in uno spazio web (ce ne sono molti gratuiti) e fare riferimento a quello per i collegamenti. Per evitarsi ulteriori complicazioni scegliere uno spazio pubblico, che non richieda credenziali di accesso. Altre soluzioni Cito altre soluzioni, trovate su internet, che per non ho avuto modo di sperimentare: Gestire i path con la classe VirtualPathUtility Vedere http://www.aspitalia.com/script/781/Gestire-Path-Classe-VirtualPathUtility-ASP.NET-2.0.aspx Inserire le immagini nei .css Vedere http://www.dotnethell.it/forum/messages.aspx?ThreadID=21534

OPERAZIONI SU FILE E STRINGHE ESEMPI (attenzione: alcune della variabili utilizzate nelle routine che seguono sono dichiarate a livello di pagina)
CONTA
Sub ContaFile() Dim counter As System.Collections.ObjectModel.ReadOnlyCollection(Of String) counter = My.Computer.FileSystem.GetFiles("F:\Siti Web in elaborazione\SitoProve\servizi") TextBox1.Text = "number of files is " & CStr(counter.Count) End Sub

ELENCA FILE
Sub ElencaFile() NrExcel = 0 For Each foundFile As String In My.Computer.FileSystem.GetFiles("F:\Siti Web in elaborazione\SitoProve\servizi") If Right(foundFile, 3) = "xls" Then PathNomeExcel = foundFile ListBox1.Items.Add(foundFile) NrExcel = NrExcel + 1 End If Next Me.ListBox1.Height = Me.ListBox1.Height.Value * NrExcel TextBox1.Text = NrExcel End Sub

ELENCA CARTELLE DI SISTEMA


Sub ElencaCartelle() For Each drive As System.IO.DriveInfo In System.IO.DriveInfo.GetDrives Dim node As TreeNode = New TreeNode node.Value = drive.Name If drive.IsReady Then node.Text = drive.Name & "free space_" & drive.AvailableFreeSpace 'loadDirectories(node, drive.Name) 'funzione che poi caricher i contenuti dei drive Else node.Text = drive.Name & "- not ready " End If Me.TreeView1.Nodes.Add(node) Next Me.TreeView1.CollapseAll() End Sub

ESTRAE PARTE DI UNA STRINGA


Function SoloNomeExcel(ByVal Completo As String) As String Dim Lunghezza As Integer, X As Integer, Y As Integer
sabato 6 luglio 2013 Pag. 61 / 151

SVILUPPARE UN SITO WEB ASP.NET

Dim Parziale As String Dim Caratteri(0) As String Dim Posizione As Integer Completo = Trim(Completo) Lunghezza = Len(Completo) For X = 0 To Lunghezza - 1 Posizione = Lunghezza + 1 - X If Not Mid(Completo, Posizione, 1) = Chr(92) Then Caratteri(X) = Mid(Completo, Posizione, 1) ReDim Preserve Caratteri(UBound(Caratteri) + 1) Else Exit For End If Next Parziale = "" For Y = UBound(Caratteri) - 1 To 1 Step -1 Parziale = Parziale & Caratteri(Y) Next Parziale = Replace(Parziale, ".xls", "") SoloNomeExcel = Parziale End Function

CONNESSIONI A DATABASE E FONTI ESTERNE


Per lavorare con un database o fonti esterne di dati (MS Excel, Word, Outlook etc.) occorre stabilire una connessione tra loggetto destinatario dei dati da prelevare ed il database stesso. La modalit di connessione si svolge attraverso passi logici successivi, ed dipendente dal tipo di fonte (MS Access, SQL Server etc.), dalloggetto destinatario (in genere un controllo), e dalle funzioni che si desiderano.

STRINGHE DI CONNESSIONE
Le stringhe di connessione dipendono dal database e dal protocollo che si usa (fondamentalmente OleDb o ODBC; per le differenze vedere http://online.infomedia.it/riviste/cp/94/articolo16/articolo.htm). Le pi comuni sono le seguenti: MS Access ODBC

"Driver={Microsoft Access Driver (*.mdb)}; Dbq=c:\percorso\database.mdb; Uid=admin; Pwd=password;"


OLE-db

"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\percorso\database.mdb;"


SQL Server ODBC

"Driver={SQL Server}; Server=nomeserver; Database=nomedatabase; Uid=admin; Pwd=password;" "Driver={SQL Server}; Server=nomeserver; Database=nomedatabase; Trusted_Connection=yes;"
OLE-db

"Provider=sqloledb; Data Source=nomeserver; Initial Catalog=nomedatabase; User Id=admin; Password=pwsord;" "Provider=sqloledb; Data Source=nomeserver; Initial Catalog=nomedatabase; Integrated Security=SSPI;"
SqlClient per il .NET Framework

"Data Source=nomeserver; Initial Catalog=nomedatabase; User Id=sa; Password=password;" "Data Source=nomeserver; Initial Catalog=nomedatabase; Integrated Security=SSPI;"
mySQL ODBC

"Driver={mySQL}; Server=nomeserver; Database=nomedatabase; Uid=admin; Pwd=password;"


sabato 6 luglio 2013 Pag. 62 / 151

SVILUPPARE UN SITO WEB ASP.NET

OLE-db

"Provider=MySQLProv; Data Source=nomeserver; User Id=admin; Password=password;"


mySQLClient per il .NET Framework

"Data Source=nomeserver; Database=nomedatabase; User ID=admin; Password=password;"


Excel ODBC

"Driver={Microsoft Excel Driver (*.xls)}; DriverId=790; Dbq=c:\percorso\foglio.xls;"


OLE-db

"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\percorso\foglio.xls; Extended Properties=Excel 8.0;HDR=Yes;" OGGETTO CONNESSIONE


loggetto che istanzia il contenitore della connessione: secondo il protocollo scelto pu essere OleDbConnection o ODBCConnection. Per le rispettive specifiche vedere sul sito Microsoft http://msdn.microsoft.com/it-it/library/system.data.oledb.oledbconnection.aspx e http://msdn.microsoft.com/it-it/library/system.data.odbc.odbcconnection.aspx. Classe OleDbConnection Un oggetto OleDbConnection rappresenta una connessione univoca a un'origine dati. Nel caso di un sistema di database client/server, equivalente a una connessione di rete al server. Quando si crea un'istanza della classe OleDbConnection tutte le propriet vengono impostate sui valori iniziali riportati di seguito, a meno che non siano impostate in maniera specifica mediante le parole chiave associate nella propriet ConnectionString.

ConnectionString ConnectionTimeout Database DataSource


Costruttori
Nome OleDbConnectio n

stringa vuota ("") 15 stringa vuota ("") stringa vuota ("")

Descrizione Sottoposto a overload. Inizializza una nuova istanza della classe OleDbConnection. OleDbConnection() Inizializza una nuova istanza della classe OleDbConnection.

Dim connection As New OleDbConnection()


OleDbConnection(String ) Inizializza una nuova istanza della classe OleDbConnection con la stringa di connessione specificata.

Using connection As New OleDbConnection(connectionString)


Metodi (pi frequenti)
Nome BeginTransaction Descrizione Sottoposto a overload. Avvia una transazione di database. Esempio su creazione di una classe OleDbConnection e una classe OleDbTransaction e modalit di utilizzo dei metodi BeginTransaction, Commit e Rollback qui. Chiude la connessione all'origine dati. Il metodo Close esegue il rollback di tutte le transazioni in sospeso.

Close

sabato 6 luglio 2013 Pag. 63 / 151

SVILUPPARE UN SITO WEB ASP.NET

Nome CreateCommand GetType Open

Descrizione Crea e restituisce un oggetto OleDbCommand associato alla classe OleDbConnection. Ottiene l'oggetto Type dell'istanza corrente. Apre una connessione a un database con le impostazioni delle propriet specificate dalla propriet ConnectionString.

Propriet (pi frequenti)


Nome ConnectionString Descrizione Ottiene o imposta la stringa utilizzata per aprire un database. Quando la propriet impostata, viene eseguita un convalida preliminare della stringa di connessione. Se nella stringa sono inclusi i valori di Provider, Connect Timeout, Persist Security Info o OLE DB Services, tali valori vengono verificati. Quando un'applicazione chiama il metodo Open, la stringa di connessione viene convalidata in maniera completa. Se la stringa contiene propriet non valide o non supportate, verr generata un'eccezione di runtime, come ArgumentException. Ottiene il tempo di attesa mentre si tenta di stabilire una connessione, prima di terminare il tentativo e generare un errore. Ottiene il nome del database corrente o del database da utilizzare una volta aperta la connessione. Ottiene il nome server o il nome file dell'origine dati. Ottiene il nome del provider OLE DB specificato nella clausola "Provider= " della stringa di connessione. Ottiene lo stato corrente della connessione.

ConnectionTimeou t Database DataSource Provider State

Dim instance As OleDbConnection Dim value As ConnectionState value = instance.State


Eventi
Nome Disposed Descrizione Si verifica quando il componente viene eliminato da una chiamata al metodo Dispose. (Ereditato da Component) Viene generato quando il provider invia un avviso o un messaggio informativo. necessario che i client che intendono elaborare avvisi o messaggi informativi inviati dal server creino un delegato OleDbInfoMessageEventHandler per attendere questo evento. L'evento InfoMessage viene generato quando dall'origine dati viene restituito un messaggio con un livello di gravit basso. Tali messaggi non determinano un'eccezione. StateChange Sottoposto a overload.

InfoMessage

Implementazioni esplicite dell'interfaccia


Nome BeginTransactio n ICloneable.Clone CreateCommand Sottoposto a overload. Descrizione

Per una descrizione di questo membro, vedere il metodo ICloneable.Clone. Sottoposto a overload.

sabato 6 luglio 2013 Pag. 64 / 151

SVILUPPARE UN SITO WEB ASP.NET

DEFINIZIONE DEI DATI DA ELABORARE


La definizione avviene attraverso istruzioni SQL. La loro sintassi, pur avendo delle leggere variazione in relazione al software utilizzato, ha per una struttura di base uguale per tutti. Un comodo riepilogo delle istruzioni SQL si trova allindirizzo http://www.kof.it/manuali/sql.pdf.

METODO DI ELABORAZIONE CLASSE OLEDBCOMMAND


Rappresenta un'istruzione SQL o una stored procedure da eseguire in relazione a un'origine dati. La classe comprende i seguenti metodi per l'esecuzione di comandi in un'origine dati:

ExecuteReader

Esegue comandi che restituiscono righe. Invia la propriet CommandText alla propriet Connection e genera un oggetto OleDbDataReader. possibile che il metodo ExecuteReader non abbia l'effetto desiderato se utilizzato per eseguire comandi quali istruzioni SQL SET. Esegue comandi quali istruzioni SQL INSERT, DELETE, UPDATE e SET. Esegue un'istruzione SQL nella propriet Connection e restituisce il numero di righe modificate. possibile utilizzare il metodo ExecuteNonQuery per eseguire operazioni di catalogo, ad esempio eseguire query sulla struttura di un database o creare oggetti del database quali tabelle, oppure modificare i dati contenuti in un database senza utilizzare una classe DataSet, eseguendo le istruzioni UPDATE, INSERT o DELETE. Recupera un valore singolo, ad esempio un valore aggregato, da un database. Utilizzare il metodo ExecuteScalar per recuperare un valore singolo, ad esempio un valore aggregato, da un'origine dati. Questa operazione richiede una quantit di codice minore rispetto all'utilizzo del metodo ExecuteReader e quindi rispetto all'esecuzione delle operazioni necessarie per generare il valore singolo utilizzando i dati restituiti da una classe OleDbDataReader.

ExecuteNonQuery

ExecuteScalar

Costruttori
Nome OleDbCommand Descrizione Sottoposto a overload. Inizializza una nuova istanza della classe OleDbCommand. Dim instance As New OleDbCommand() Dim instance As New OleDbCommand(cmdText) Dim instance As New OleDbCommand(cmdText, connection) Dim instance As New OleDbCommand(cmdText, connection, transaction)

Metodi (pi frequenti)


Nome Cancel Descrizione Tenta di annullare l'esecuzione di una classe OleDbCommand. Se non sono presenti operazioni da annullare, non viene eseguita alcuna azione. Tuttavia, se un comando in esecuzione e il tentativo di annullarlo non riesce, non verr generata alcuna eccezione. Crea un nuovo oggetto OleDbCommand che una copia dell'istanza corrente.

Clone

Dim instance As OleDbCommand Dim returnValue As OleDbCommand returnValue = instance.Clone()


CreateParameter Crea una nuova istanza di un oggetto OleDbParameter.

Dim instance As OleDbCommand Dim returnValue As OleDbParameter returnValue = instance.CreateParameter()


Classe OleDbParameter - Nel provider di dati OLE DB.NET Framework vengono utilizzati parametri di posizione, contrassegnati con un punto interrogativo (?), anzich parametri denominati.
ExecuteNonQuery ExecuteReader Esegue un'istruzione SQL nella propriet Connection e restituisce il numero di righe modificate. (Esegue l'override di DbCommand.ExecuteNonQuery()). Sottoposto a overload. Invia la propriet CommandText alla propriet Connection e genera un oggetto OleDbDataReader. sabato 6 luglio 2013 Pag. 65 / 151

SVILUPPARE UN SITO WEB ASP.NET

Nome ExecuteScalar

Descrizione Esegue la query e restituisce la prima colonna della prima riga nel gruppo di risultati restituito dalla query. Le colonne o le righe aggiuntive vengono ignorate.

Propriet (pi frequenti)


Nome CommandText Descrizione Ottiene o imposta l'istruzione SQL o la stored procedure da eseguire all'origine dati.

Dim instance As OleDbCommand Dim value As String value = instance.CommandText instance.CommandText = value
Il provider OLE DB.NET non supporta i parametri denominati per il passaggio di parametri a un'istruzione SQL o una stored procedure chiamata da una classe OleDbCommand quando la propriet CommandType impostata su Text. In casi simili occorre utilizzare il segnaposto punto interrogativo (?). Ad esempio:

SELECT * FROM Customers WHERE CustomerID = ?


necessario quindi che l'ordine in cui gli oggetti OleDbParameter vengono aggiunti alla classe OleDbParameterCollection corrisponda direttamente alla posizione del segnaposto punto interrogativo per il parametro.
CommandTimeou t CommandType Ottiene o imposta il tempo di attesa prima di terminare il tentativo di eseguire un comando e generare un errore. Ottiene o imposta un valore che indica come viene interpretata la propriet CommandText.

Dim instance As OleDbCommand Dim value As CommandType value = instance.CommandType instance.CommandType = value
Quando si imposta la propriet CommandType su StoredProcedure, necessario impostare la propriet CommandText sul nome della stored procedure. Il comando eseguir la stored procedure quando viene chiamato uno dei metodi Execute. Connection Ottiene o imposta la classe OleDbConnection utilizzata da questa istanza della classe OleDbCommand.

Dim instance As OleDbCommand Dim value As OleDbConnection value = instance.Connection instance.Connection = value
Parameters Ottiene la classe OleDbParameterCollection.

Dim instance As OleDbCommand Dim value As OleDbParameterCollection value = instance.Parameters


Transaction Ottiene o imposta la classe OleDbTransaction in cui viene eseguita la classe OleDbCommand.

Dim instance As OleDbCommand Dim value As OleDbTransaction value = instance.Transaction instance.Transaction = value
Se si imposta la propriet della transazione su un oggetto OleDbTransaction non connesso allo stesso oggetto OleDbConnection dell'oggetto OleDbCommand, al successivo tentativo di eseguire un'istruzione viene generata un'eccezione.

Esempi Viene creata una classe OleDbCommand e ne vengono impostate alcune propriet

Public Sub CreateReader(ByVal connectionString As String, ByVal queryString As String) Using connection As New OleDbConnection(connectionString) Dim command As New OleDbCommand(queryString, connection)
sabato 6 luglio 2013 Pag. 66 / 151

SVILUPPARE UN SITO WEB ASP.NET

command.CommandTimeout = 20 connection.Open() Dim reader As OleDbDataReader = command.ExecuteReader() While reader.Read() Console.WriteLine(reader(0).ToString()) End While reader.Close() End Using End Sub
Viene creata una classe OleDbCommand e ne vengono impostate alcune propriet

Public Sub CreateMyOleDbCommand() Dim queryString As String = "SELECT * FROM Categories ORDER BY CategoryID" Dim command As New OleDbCommand(queryString) command.CommandTimeout = 20 End Sub
Nell'esempio riportato di seguito vengono create pi istanze della classe OleDbParameter tramite l'insieme OleDbParameterCollection, all'interno della classe OleDbDataAdapter. Questi parametri vengono utilizzati per la selezione dei dati dall'origine dati e per la loro immissione nella classe DataSet. Nell'esempio si presuppone la precedente creazione di una classe DataSet e di una classe OleDbDataAdapter con la connessione, i comandi e lo schema appropriati.

Public Function GetDataSetFromAdapter(ByVal dataSet As DataSet, ByVal connectionString As String, ByVal queryString As String) As DataSet Using connection As New OleDbConnection(connectionString) Dim adapter As New OleDbDataAdapter(queryString, connection) ' Set the parameters. adapter.SelectCommand.Parameters.Add("@CategoryName", OleDbType.VarChar, 80).Value = "toasters" adapter.SelectCommand.Parameters.Add("@SerialNum", OleDbType.Integer).Value = 239 ' Open the connection and fill the DataSet. Try connection.Open() adapter.Fill(dataSet) Catch ex As Exception Console.WriteLine(ex.Message) End Try ' The connection is automatically closed when the ' code exits the Using block. End Using Return dataSet End Function
Nell'esempio riportato di seguito viene creata una classe OleDbCommand che viene quindi eseguita mediante il metodo ExecuteNonQuery. All'esempio viene passata una stringa che rappresenta un'istruzione SQL, come UPDATE, INSERT o DELETE, e una stringa da utilizzare per la connessione all'origine dati.

Private Sub CreateOleDbCommand(ByVal queryString As String, ByVal connectionString As String) Using connection As New OleDbConnection(connectionString) connection.Open() Dim command As New OleDbCommand(queryString, connection) command.ExecuteNonQuery() End Using End Sub
Nell'esempio riportato di seguito viene creata una classe OleDbCommand che viene quindi eseguita mediante il metodo ExecuteScalar. Nell'esempio viene passata una stringa che un'istruzione SQL che restituisce un risultato aggregato e una stringa da utilizzare per la connessione all'origine dati.

Public Sub CreateMyOleDbCommand(queryString As String, connection As OleDbConnection) Dim command As New OleDbCommand(queryString, connection) command.Connection.Open() command.ExecuteScalar() connection.Close() End Sub
sabato 6 luglio 2013 Pag. 67 / 151

SVILUPPARE UN SITO WEB ASP.NET

Nell'esempio riportato di seguito viene creata una classe OleDbCommand e ne vengono impostate alcune propriet

Public Sub CreateOleDbCommand() Dim queryString As String = "SELECT * FROM Categories ORDER BY CategoryID" Dim command As New OleDbCommand(queryString) command.Connection = New OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NWIND_RW.MDB") command.CommandTimeout = 20 End Sub

PAGINE MASTER
(vedere anche http://www.visual-basic.it/articoli/acmdgTutAspNet01.htm) Una pagina master un file che definisce un template HTML comune a una o pi pagine Web. A differenza di una normale pagina ASP.NET, la pagina master contiene una serie di regioni vuote, ma riempibili da contenuti che la pagina figlia decide. Ciascuna di queste regioni ha un ID univoco. La pagina figlia (altrimenti detta content page o pagina di contenuti) ha una struttura estremamente semplice che consiste di uno o pi blocchi di codice markup per quante sono le regioni del master da riempire. Una pagina content indica la propria pagina master allinterno della direttiva @Page. Una pagina master pu essere legata ad un numero qualunque di pagine content. Quando viene richiesta una pagina che punta ad una pagina master, il runtime di ASP.NET applica un algoritmo di compilazione che costruisce la pagina finale fondendo insieme master e content. La pagina master contiene le parti comuni delle pagine del sito che non hanno bisogno di essere personalizzate (per esempio, logo e titolo): possono essere grafica, testo, markup, codice script, codice serverside. La pagina master inoltre contiene dei tag segnaposto per il contenuto che verr specificato solo dalle pagine derivate. Ogni pagina content fa riferimento al suo master e provvede al riempimento delle varie regioni personalizzabili. Pagina Master Una pagina master un file con estensione .master. Ha due caratteristiche essenziali: Usa la direttiva @Page.

@Master (vederne gli attributi in Appendice a pag.60) al posto della direttiva

Contiene uno o pi controlli ContentPlaceHolder. Ciascun controllo ContentPlaceHolder identifica una regione personalizzabile (identificata dalla propriet ID) il cui effettivo contenuto verr determinato solo a runtime da una pagina content.

Una pagina master conterr tanti controlli placeholder per quante sono le regioni personalizzabili della pagina. Una pagina content non obbligata a riempire tutte le aree dinamiche del master; per, una pagina content non pu contenere altro che codice destinato ai placeholder del master. Il placeholder pu restare vuoto oppure visualizzare un contenuto di default. Il contenuto di default (nellesempio sotto <$VE;>) viene usato solo se la pagina derivata non ridefinisce il placeholder. Pagina Content Una pagina content una pagina .aspx formata unicamente da elementi di tipo <asp:Content>, che corrisponde ad una istanza della classe Content la quale fornisce leffettivo contenuto per uno dei placeholder definiti nel master. Lassociazione tra controllo ContentPlaceHolder e Content avviene sul valore dellID del placeholder. Si veda lesempio: sulla pagina Master

<asp:contentplaceholder runat=server ID=Body />


sulla pagina content

<asp:Content runat=server contentplaceholderID=Body> <$VE;> </asp:Content>

sabato 6 luglio 2013 Pag. 68 / 151

SVILUPPARE UN SITO WEB ASP.NET

La pagina content associata al master tramite lattributo

MasterPageFile definito nella direttiva

@Page. Lattributo contiene il percorso del file master: <%@ Page Language=C# MasterPageFile=primo.master %>
Master annidati Una pagina master pu essere a sua volta collegata con unaltra pagina master fino a formare una struttura annidata. Poich VWD nella versione 2005 non gestisce in modo automatico i master annidati , occorre procedere manualmente intervenendo direttamente nel codice. La versione 2008 permette di impostare automaticamente in modo corretto la relazione tra il master che si crea e quello di livello superiore.

In una struttura in cui sono presenti pagine master annidate ciascuna pagina si comporta nei confronti del proprio master come una normale pagina content. Ci accade indipendentemente dal fatto che la pagina content sia a sua volta una pagina master. Una pagina master collegata ad un altro master pu contenere una qualsiasi combinazione di elementi <asp:Content> e <asp:ContentPlaceHolder>. Come una normale pagina content, un master di livello intermedio punta al suo master. Al tempo stesso, per, essa fornisce contenuti ai placeholder del suo master e definisce nuovi placeholder per le sue pagine derivate. Non vi alcun limite architetturale o tecnologico al numero di livelli di annidamento. Si faccia un esempio: Il master principale (parent.master) descrive la struttura complessiva delle pagine, header, body, footer. Il master figlio (child.master) descrive dettagliatamente la struttura del body per alcuni tipi di pagina. Ci significa che il sito formato da pagine che appartengono a gruppi logici differenti, ciascuno dei quali richiede un differente schema. Per esempio, definiamo un master figlio che prevede la presenza di un menu nel body. Sar compito delle pagine content impostare pulsanti e hyperlink per il menu. Master principale <%@ Master %> <html> <head> <link rel=Stylesheet href=styles.css /> </head> <body> <form runat=server> <table> <tr bgcolor=aqua> <td> <span class=title>My Very First Master Page</span> </td> </tr> <tr> <td style=text-align:center> <asp:contentplaceholder runat=server ID=Body /> </td> </tr> <tr bgcolor=aqua> <td style=text-align:center>
sabato 6 luglio 2013 Pag. 69 / 151

SVILUPPARE UN SITO WEB ASP.NET

<p>Courtesy of this book!</p> </td> </tr> </table> </form> </body> </html> Master figlio <%@ Master Language=C# Master=parent.master %> <asp:content runat=server contentplaceholderID=Body> <table> <tr bgcolor=aqua> <td width=100%><span class=title>Subtitle</span></td> </tr> <tr> <td width=100% style=text-align:center> <asp:contentplaceholder runat=server ID=Menu /> </td> </tr> </table> </asp:content> Pagina content <%@ Page Language=C# Master=child.master %> <script runat=server> void OnDownload(object sender, EventArgs e) { msg.Text = Going to download; } void OnJobs(object sender, EventArgs e) { msg.Text = Going to show jobs; } void OnAboutUs(object sender, EventArgs e) { msg.Text = Going to show something about us; } </script> <asp:content runat=server contentplaceholderID=Menu> <div> <asp:button runat=server text=Download onclick=OnDownload /> <asp:button runat=server text=Jobs onclick=OnJobs /> <asp:button runat=server text=About Us onclick=OnAboutUs /> <hr> <asp:label runat=server id=msg text=Hello, Master Pages /> </div> </asp:content>

TIPI DI CONTROLLI
HTML Controls Sono i controlli che utilizzano i normali tag HTML. Vengono processati sul client. Server Controls Controlli propri di ASP.Net, processati dal server. Comprendono le seguenti categorie: HTML Server Controls Sono gli equivalenti degli elementi html, controllabili lato server. Per crearli in genere sufficiente aggiungere l'attributo runat="server" al tradizionale tag Html. Di seguito un elenco di tutti i namespace degli HTML Controls: HtmlAnchor Elemento HTML <a> HtmlButton Elemento HTML <button> HtmlContainerControl HtmlControl HtmlForm Elemento HTML <form> HtmlGeneric Elementi generici come <body>, <div>, <span>, etc.
sabato 6 luglio 2013 Pag. 70 / 151

SVILUPPARE UN SITO WEB ASP.NET

HtmlGenericControl HtmlImage HtmlInputButton HtmlInputCheckBox HtmlInputControl HtmlInputFile HtmlInputHidden HtmlInputImage HtmlInputRadioButton HtmlInputText HtmlSelect HtmlTable HtmlTableCell HtmlTableCellCollection HtmlTableRow HtmlTableRowCollection HtmlTextArea

classe generica per gli elementi non definiti in ASP.NET. Elemento HTML <image> Elemento HTML <input type="button">, <input type="submit">, type="reset"> Elemento HTML <input type="checkbox"> Elemento Elemento Elemento Elemento Elemento Elemento HTML HTML HTML HTML HTML HTML <input type="file"> <input type="hidden"> <input type="image"> <input type="radio"> <input type="text"> e <input type="password"> <select>

<input

Elementi HTML <table>,<td>, <th> e <tr> Elemento HTML <textarea>

Web Form Server Controls Sono dei tag speciali di ASP.NET, a differenza dei controlli HTML non corrispondono necessariamente ad un tag HTML, ma possono anche rappresentare strutture pi complesse. La sintassi base per creare un controllo server <asp:nome_controllo>. Di seguito un elenco di tutti i namespace dei Web Form Server Controls: AdRotator Mostra una sequenza di immagini Button Un bottone cliccabile Calendar Un calendario CheckBox una check box CheckBoxList Un gruppo di check box DataGrid Mostra i campi di un datasource n una griglia DataList Mostra gli elementi di un datasource utilizzando dei templates DropDownList Una lista di elementi HyperLink Un link ipertestuale Image Una immagine ImageButton Una immagine cliccabile Label Contenuto statico programmabile LinkButton Un bottone con un link ipertestuale ListBox Una lista di elementi a selezione singola o multipla Literal Contenuto statico programmabile Panel Un contenitore di controlli PlaceHolder Per preservare dello spazio per elementi creati via codice RadioButton Un radio button RadioButtonList Un gruppo di radio buttons Repeater Una lista di elementi ripetuti legati ad un controllo Table Una tabella TableCell La cella di una tabella TableRow Una riga di tabella TextBox una textbox Xml Mostra un file xml o il risultato di una trasformazione XSL Validation Server Controls I Validation server controls sono usati per validare gli input utente. Se linput non supera la validazione, verr visualizzato un messaggio derrore allutente. La sintassi analoga a quella per i contr olli web. Elenco dei Validation Controls:

RequiredFieldValidator

verifica se il comando convalidato contiene un valore. Eventuali spazi bianchi all'inizio o alla fine del valore inserito vengono automaticamente eliminati prima della convalida, per evitare che la convalida venga bypassata inserendo uno spazio.

sabato 6 luglio 2013 Pag. 71 / 151

SVILUPPARE UN SITO WEB ASP.NET

<asp:RequiredFieldValidator ID="rfvCompanyName" runat="server" ControlToValidate="txtCompanyName" ErrorMessage="Specificare il nome del cliente!" Display="None" SetFocusOnError="true" Text="*" /> CompareValidator
verifica se il valore inserito in un controllo input sia uguale al valore inserito in un controllo input, utilizzando la propriet ControlToCompare, o con una costante utilizzando la propriet ValueToCompare. possibile utilizzare il comando CompareValidator per determinare se il valore inserito in un controllo input corrisponde ad un tipo specifico utilizzando la propriet Type. La propriet Operator permette di specificare il tipo di comparazione tra i due campi di input (Equal, GreaterThen, LessThenorEqual, ecc.). Se la propriet Operator viene impostata su validatorCompareOperator.DataTypeCheck, il comando CompareValidator ignorer le propriet ControlToCompare e ValueToCompare, e indicher se il valore inserito pu essere convertito nel tipo specificato dalla propriet Type. Se il controllo input rimane vuoto nessuna funzione di convalid verr invocata e la convalida passer il test. Per evitare questo tipo di problema possibile associare allo stesso campo anche la convalida RequiredFieldValidator.

<asp:CompareValidator id="CompareFieldValidator1" runat="server" ControlToValidate="txtEmail1" ControlToCompare="txtEmail" Type="String" Operator="Equal" ErrorMessage="(*) Errore... Controllare l'indirizzo Email inserito!" ForeColor="Red" > </asp:CompareValidator> <asp:CompareValidator id="CompareFieldValidator1" runat="server" ControlToValidate="txtData" ValueToCompare="01/01/2004" Operator="GreaterThan" Type="Date" ErrorMessage="(*) Errore... La data deve essere successiva al 01/01/2004!" ForeColor="Red"> </asp:CompareValidator> <asp:CompareValidator id="CompareValidator1" runat="server" ControlToValidate="txtPassword1" ControlToCompare="txtPassword2" Operator="Equal" ErrorMessage="Passwords don't match"></asp:CompareValidator> RangeValidator
verifica se il valore inserito in una casella di input sia compreso tra due valori, impostati rispettivamente nelle propriet MinimumValue e MaximumValue. I valori controllabili possono essere sia numerici, alfanumerici o date. La propriet Type utilizzata per specificare il tipo di dati da comparare. Se il controllo input rimane vuoto nessuna funzione di convalid verr invocata e la convalida passer il test. Per evitare questo tipo di problema possibile associare allo stesso campo anche la convalida RequiredFieldValidator.
sabato 6 luglio 2013 Pag. 72 / 151

SVILUPPARE UN SITO WEB ASP.NET

<asp:RangeValidator id="RangeFieldValidator1" runat="server" ControlToValidate="txtNumero" MinimumValue="1" MaximumValue="10" Type="Integer" ErrorMessage="(*) Errore... Il numero deve essere compreso tra 1 e 10!" ForeColor="Red" > <asp:RangeValidator id="RangeValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="Invalid Age" MinimumValue="18" MaximumValue="120" Type="Integer"> </asp:RangeValidator> RegularExpressionValidator
verifica se il valore inserito in una casella di input corrisponda ad una regular expression. possibile per esempio valicare una determinata sequenza di caratteri, quali codici fiscali, email, numeri di telefono, ecc. Approfondimenti sulle espressioni regolari si trovano in http://msdn.microsoft.com/it-it/library/hs600312(VS.80).aspx, e pratici schemi in http://www.pluto.it/files/ildp/guide/abs/regexp.html e http://regexlib.com/CheatSheet.aspx. Di seguito (pag.75) si riportano le espressioni regolari pi utilizzate per lautenticazione di campi. Se il controllo input rimane vuoto nessuna funzione di convalid verr invocata e la convalida passer il test. Per evitare questo tipo di problema possibile associare allo stesso campo anche la convalida RequiredFieldValidator. Questo comando controlla che il valore inserito in una casella di input sia valido rispetto ad una funzione di convalida personalizzata creata dall'utente, per esempio una funzione per verificare se il numero immesso sia pari. possibile creare un comando di convalida personalizzato sia latoserver, sia lato-client; il controllo lato-client richiede un browser compatibile DHTML. La convalida lato-client sar sempre eseguita prima di quella lato-server. Per creare una funzione di convalida lato-server necessario settare nella propriet OnServervalidator il nome della funzione di convalida. La stringa da convalidare viene letta dalla propriet Value dell'oggetto ServerValidateEventArgs della funzione stessa. Il risultato della convalida va memorizzato nella propriet IsValid dell'oggetto ServerValidateEventArgs. Per creare una funzione di convalida lato-client necessario settare nella propriet ClientvalidatorFunction il nome della funzione di convalida. Utilizzando JavaScript come linguaggio di programmazione la funzione utilizzer la seguente sintassi:

CustomValidator

Function validatorFunctionName (source, arguments)


Mentre nel caso di Vbscirpt:

Sub validatorFunctionName (source, arguments)


Come per la convalida lato-server, anche la convalida lato-client utilizzer la propriet Value del parametro arguments per leggere il valore da convalidare; il risultato della convalid andr memorizzato nella propriet IsValid. Per evitare che qualche malintenzionato cerchi di evitare la convalida lato-client, magari disabilitando gli script nel proprio browser, sempre consigliato creare la stessa funzione anche sul lato-server. Se il controllo input rimane vuoto nessuna funzione di convalid verr invocata e la convalida passer il test. Per evitare questo tipo
sabato 6 luglio 2013 Pag. 73 / 151

SVILUPPARE UN SITO WEB ASP.NET

di problema possibile associare allo stesso campo anche la convalida RequiredFieldValidator. Vedere esempi in http://www.lukeonweb.net/246.asp, in http://steveorr.net/articles/Validation.aspx ed in http://www.aspitalia.com/articoli/asp.net/validatorcontrols-p5.aspx.

ValidationSummary

utilizzato per visualizzar l'elenco degli errori riscontrati da tutti i validator controls. Il sommario degli errori pu essere visualizzato in diversi modi: elenco, punto elenco o paragrafo, a seconda del modo in cui viene impostata la propriet DisplayMode; il comando visualizzer il testo contenuto nella propriet ErrorMessage di ogni comando che non supera il test di convalida. Un'altra propriet utile di questo comando ShowMessageBox che, se impostata su True, visualizza un finestra di dialogo alert sul client con il sommario degli errori. <asp:ValidationSummary ID="vErrors" DisplayMode="BulletList" ShowSummary="true" runat="server" />

Il principio di utilizzo dei validator controls si basa sull'associazione di uno o pi validator controls (che vengono legati tra loro con la logica AND) a ciascuno dei comandi di input da convalidare. Quando l'utente invia la pagina ogni comando di convalida controlla se il valore immesso corrisponde ai criteri definiti. Una volta che tutti i validator controls hanno eseguito la verifica, viene settata la propriet di pagina Page.IsValid. Se anche solo uno dei controlli non passa il test di convalida l'intera pagina viene 'settata' come invalida ed i controlli che hanno fallito il test visualizzano un messaggio di errore. Inoltre, se impostato, il comando contenuti nella pagina.

<ASP:ValidationSummary> visualizzer il riepilogo degli errori

Propriet comuni a tutti i Validator Controls: ControlToValidate imposta o restituisce il nome del comando da convalidare; Display questa propriet pu assumere uno dei seguenti valori: None il messaggio di errore non viene visualizzato accanto al controllo da convalidare; questa opzione pu essere utilizzata se si vuole visualizzare il messaggio d'errore solo nel controllo ValidationSummary

Static il comando di convalida visualizza un messaggio d'errore

EnableClientScript Enabled ErrorMessage ForeColor IsValid Text

se la convalida fallisce. Lo spazio per il messaggio d'errore viene calcolato all'interno della pagina anche se la convalida non fallisce, quindi il layout della pagina non cambia Dynamic il comando di convalida visualizza un messaggio d'errore se la convalida fallisce. Lo spazio per il messaggio d'errore viene calcolato dinamicamente nella pagina quando la convalida fallisce, quindi potrebbe cambiare il layout della pagina imposta o restituisce un valore booleano che indica se la convalida lato-client attiva imposta o restituisce un valore booleano che indica se la convalid verr effettuata imposta o restituisce il testo del messaggio visualizzato nel caso la convalida fallisca. Questa propriet utilizzata per visualizzare differenti messaggi d'errore nel controllo ValidatioSummary. imposta o restituisce il colore con cui verr visualizzato il messaggio d'errore nel caso la convalida fallisca imposta o restituisce un valore booleano che indica se il valore del comando di input associato ha passato la convalida imposta o restituisce il testo che sar visualizzato come messaggio d'errore nel caso la convalida fallisca. Se questa propriet non viene settata, come messaggio d'errore viene utilizzata la propriet ErrorMessage.

sabato 6 luglio 2013 Pag. 74 / 151

SVILUPPARE UN SITO WEB ASP.NET

Espressioni Regolari Le epressioni iniziano sempre con il simbolo Simboli Esempi

^ e terminano con il simbolo $


validazione Descrizione la corrispondenza deve verificarsi all'inizio della stringa la corrispondenza deve verificarsi al termine della stringa la corrispondenza deve verificarsi nel punto in cui terminata la corrispondenza precedente Qualunque carattere, eccetto a capo uno qualsiasi dei termini separati dal carattere | (barra verticale) Corrisponde all'elemento precedente esattamente n volte Corrisponde all'elemento precedente almeno n volte Corrisponde all'elemento precedente almeno n volte, ma non pi di m volte

^ $ \G . | {n} {n,} {n,m} [...]


a[bB]c [\p{P}\d] abc, aBc specifica tutta la punteggiatura e le cifre decimali specifica tutti i caratteri eccetto la punteggiatura e le cifre decimali Abcabc ac, abc, abbc, abbbc, ... abc, abbc, abbbc, ... ac, abc ac a.c bill|ted ab{2}c abc, aac, acc, adc, aec, ... Ted o bill abbc

qualsiasi carattere compreso nel gruppo di caratteri specificato

[^...]

[^aeiou] [^\p{P}\d]

qualsiasi carattere non compreso nel gruppo di caratteri specificato

(...) * + ? \ -

(abc){2} ab*c ab+c ab?c a\sc

[0-9a-fA-F]

intervallo di cifre decimali comprese tra '0' e '9', intervallo di lettere minuscole comprese tra 'a' e 'f' e intervallo di lettere maiuscole comprese tra 'A' e 'F'

Raggruppamento logico di una parte dellespressione Corrisponde all'elemento precedente zero o pi volte Corrisponde all'elemento precedente una o pi volte Corrisponde all'elemento precedente zero o una volta Preceding one of the above, it makes it a literal instead of a special character. Corrisponde a un carattere di un intervallo di caratteri. Due caratteri sono contigui se hanno punti di codice Unicode adiacenti. Due o pi intervalli di caratteri possono essere concatenati

\w \W \s \S \d \D

qualsiasi carattere alfabetico qualsiasi carattere non alfabetico qualsiasi carattere di spazio qualsiasi carattere diverso da uno spazio qualsiasi cifra decimale qualsiasi carattere non numerico

sabato 6 luglio 2013 Pag. 75 / 151

SVILUPPARE UN SITO WEB ASP.NET

Simboli

Esempi

validazione

Descrizione Corrisponde a un carattere incluso in un blocco denominato Corrisponde a un carattere non incluso nel blocco denominato Commenti inline inseriti all'interno di un'espressione regolare. Il commento termina alla prima parentesi di chiusura

\p{name} \P{name} (?# )

Espressioni utilizzate nel sito: tra 6 e 12 caratteri (solo alfabetici)

<asp:RegularExpressionValidator ID="revTxtEditAccount" runat="server" ControlToValidate="TxtEditAccount" ValidationExpression="\w{6,12}" Display="None" ErrorMessage="Account: deve essere tra 6 e 12 caratteri (solo alfabetici)" />
tra 8 e 16 caratteri (anche non alfabetici)

<asp:RegularExpressionValidator ID="revTxtEditPwd" runat="server" ControlToValidate="TxtEditPwd" ValidationExpression=".{8,16}" Display="None" ErrorMessage="Password: deve essere tra 8 e 16 caratteri (anche non alfabetici)" />
formato e-mail valido

<asp:RegularExpressionValidator ID="revTxtEditEmail" runat="server" ControlToValidate="TxtEditEmail" ValidationExpression="^([\w\-\.]+)@((\[([09]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zAZ]{2,4}))$" Display="None" ErrorMessage="E-Mail: lasciare il campo vuoto o immettere un formato e-mail valido" />
formato di data valido (verifica anche mesi 28/30/31 gg. ed anni bisestili)

<asp:RegularExpressionValidator ID="revEditDataIscrizione" runat="server" ControlToValidate="TxtEditDataIscrizione" ValidationExpression="(((0[1-9]|[12][09]|3[01])([/])(0[13578]|10|12)([/])(\d{4}))|(([0][19]|[12][0-9]|30)([/])(0[469]|11)([/])(\d{4}))|((0[19]|1[0-9]|2[0-8])([/])(02)([/])(\d{4}))|((29)(\.||\/)(02)([/])([02468][048]00))|((29)([/])(02)([/])([13579 ][26]00))|((29)([/])(02)([/])([0-9][09][0][48]))|((29)([/])(02)([/])([0-9][09][2468][048]))|((29)([/])(02)([/])([0-9][09][13579][26])))" Display="None" ErrorMessage="Data di Iscrizione: immettere un formato di data valido (es. 25/11/2008)" />
cinque caratteri numerici

<asp:RegularExpressionValidator ID="revTxtEditCAP" runat="server" ControlToValidate="TxtEditCAP" ValidationExpression="\d{5}" Display="None" ErrorMessage="C.A.P.: Pu essere lasciato vuoto, ma se inserito deve avere cinque caratteri numerici" />
otto caratteri numerici, di cui il primo deve essere 0

<asp:RegularExpressionValidator ID="revTxtEditTelCasa" runat="server" ControlToValidate="TxtEditTelCasa" ValidationExpression="0{1}[0-9]{7,}" Display="None" ErrorMessage="Tel. Casa: Pu essere lasciato vuoto, ma se inserito deve avere almeno otto caratteri numerici, di cui il primo deve essere 0 (zero)" />
otto caratteri numerici, di cui il primo deve essere 3
sabato 6 luglio 2013 Pag. 76 / 151

SVILUPPARE UN SITO WEB ASP.NET

<asp:RegularExpressionValidator ID="revTxtEditCellulare" runat="server" ControlToValidate="TxtEditCellulare" ValidationExpression="3{1}[0-9]{7,}" Display="None" ErrorMessage="Cellulare: Pu essere lasciato vuoto, ma se inserito deve avere almeno otto caratteri numerici, di cui il primo deve essere 3" />
Sito Web

<asp:RegularExpressionValidator ID="revTxtInsSitoWeb" runat="server" ControlToValidate="TxtInsSitoWeb" ValidationExpression="^http:\/\/(www\.)?[a-zA-Z0-9]{3,}\.[a-zA-Z]{2,}(\/)?$" Display="None" ErrorMessage="Sito Web: Pu essere lasciato vuoto, ma se inserito deve iniziare con http:// o con http://www." />
Esempi trovati in Internet indirizzo Email:

<asp:RegularExpressionValidator id="RegularExpressionFieldValidator1" runat="server" ControlToValidate="txtTesto" ValidationExoression="^[\w\.]+@([\w-]+\.)+[\w-]{2,3}$" Operator="GreaterThan" ErrorMessage="(*) Errore ... indirizzo Email non valido!" ForeColor="Red">
il simbolo

[ ] indica un range di valori (da ... a ...)

\w

indica che sono consentiti valori alfanumerici (compreso il carattere "_") ed anche i caratteri "-" e ".", dato che il carattere "." un carattere speciale viene indicato utilizzando la notazione "\."; "[\w-\.]" indica quindi l'insieme dei caratteri (tutti gli alfanumerici, "_", "-", ".") + questo simbolo indica che la stringa precedente pu comparire un numero infinito di volte; infatti sono consenti indirizzi Email del tipo prova.prova1@prova.it @ indica che il carattere "@" deve sempre essere presente

([\w-]+\.)+

le parentesi () consentono di raggruppare le espressioni; "[\w-]+\." indica che consentito qualunque carattere alfanumerico (compreso il carattere "_") e che deve terminare con il ".". Le espressioni prima del "+": "[\w-]" e "([\w-]+\.)" possono comparire infinite volte; infatti sono consenti indirizzi Email del tipo prova@prova1.prova2.it [\w]{2,3} consente di rappresentare gli ultimi 2 o 3 caratteri di un indirizzo Email,

{} viene utilizzato per specificare il numero esatto di caratteri da utilizzare


numero telefonico (0773588888):

^\d{4}-\d$
l'espressione inizia con il simbolo

^ e termina con il simbolo $

\d:

per il resto del numero consentito qualunque tipo di carattere numerico (senza limiti di lunghezza)

numero telefonico (+39 347 152478):

\+39 \d{3} \d{6}


codice postale:

<asp:RegularExpressionValidator id="RegularExpressionValidator1" runat="server" ControlToValidate="TextBox1" ValidationExpression="\d{5}(\d{4})?" ErrorMessage="Invalid Zip Code!"> </asp:RegularExpressionValidator>


Password:

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s).*$
Password (deve contenere valori alfanumerici e deve essere di lunghezza non inferiore a 6 e non superiore a 15 caratteri):

/^[A-Za-z0-9]{6,15}$/
sabato 6 luglio 2013 Pag. 77 / 151

SVILUPPARE UN SITO WEB ASP.NET

Password (deve essere lunga almeno 7 caratteri, ed includere almeno un numero ed un carattere speciale):

(?=.{7,})(?=(.*\d){1,})(?=(.*\W){1,})
Codice Fiscale

^[a-zA-Z]{6}[0-9]{2}[abcdehlmprstABCDEHLMPRST]{1}[09]{2}([a-zA-Z]{1}[0-9]{3})[a-zA-Z]{1}$
tra le tonde vi l'identificativo del comune (codice catastale). Le lettere elencate (abcd ecc.) indicano il mese di nascita mentre l'ultima lettera quella di controllo User Controls Controlli generati dellutente. Dallinterfaccia VWD menu Sito web scegliere Aggiungi nuovo elemento, e nella finestra dei modelli selezionare Controllo utente web; viene generato un file con estensione .ascx che pu essere inserito allinterno di una pagina .aspx. Utilizzare i validator di ASP.NET con Custom Controls Per validare l'input di un utente nei propri controlli personalizzati mediante i validator standard di ASP.NET (RequiredFieldValidator, RangeValidator, RegularExpressionValidator, ecc.) necessario decorare la classe dello user control con l'attributo "ValidationPropertyAttribute", specificando il nome della propriet da validare:

[ValidationPropertyAttribute("Title")] public class MyControl : UserControl { private string _title = string.Empty; public string Title { get { return _title; } set { _title = value; } } // ... }
Non specificando un ValidationPropertyAttribute otterremmo infatti un errore di tipo:

System.Web.HttpException: Control 'MyControl' referenced by the ControlToValidate property of 'RequiredFieldValidator1' cannot be validated. DIRETTIVA @MASTER
possibile includere una sola direttiva @ Master in ogni file con estensione master. La direttiva @Master non sovrascrive n influenza attributi che possono essere impostati a livello della direttiva @Page.

ATTRIBUTI

AutoEventWireup
Indica se gli eventi della pagina master devono essere automaticamente associati a dei metodi per nome (per esempio, levento Load associato al metodo Page_Load). Vale true per default.

ClassName
Specifica il nome della classe generata automaticamente dal codice e compilata durante l'elaborazione della pagina master. Per tale valore possibile utilizzare qualsiasi nome di classe valido e includere uno spazio dei nomi.

CodeFile
Specifica il nome di un file distinto che contiene una classe parziale con i gestori eventi e altro codice specifico della pagina master. Per ulteriori informazioni, vedere Modello di codice di pagine Web ASP.NET.

sabato 6 luglio 2013 Pag. 78 / 151

SVILUPPARE UN SITO WEB ASP.NET

CompilationMode
Specifica se compilare una pagina master ASP.NET in fase di esecuzione. Le opzioni disponibili sono Always per compilare sempre la pagina, Auto per evitare di compilare la pagina ove possibile e Never per non compilare mai la pagina o il controllo. Il valore predefinito Always.

CompilerOptions
Indica le opzioni che il compilatore deve usare quando compila la classe della pagina master. Il compilatore usato dipende dal linguaggio scelto nel file .master.

Debug
Indica se la pagina master deve essere compilata con i simboli di debug. Se true, il codice sorgente della classe master non verr cancellato e rester memorizzato nella directory Temporary ASP.NET Files.

Description
Rappresenta una descrizione della pagina master. Ha solo scopo di documentazione.

EnableTheming
Indica se possibile modificare l'aspetto della pagina master e dei relativi controlli, se viene applicato un tema. true se possibile applicare un tema; in caso contrario false. Il valore predefinito true.

EnableViewState
Indica se i controlli della pagina master scaricano il loro stato nel viewstate in modo da ritrovarlo alla successiva richiesta. Vale true per default.

Explicit
Indica se la pagina master deve essere compilata usando lopzione Option Explicit di Visual Basic. Lattributo ignorato se il linguaggio scelto non Visual Basic.NET. Vale false per default.

Inherits
Specifica una classe code-behind da cui la pagina deve ereditare. Pu essere una classe qualsiasi derivata dalla classe MasterPage. Per informazioni sulle classi code-behind, vedere Cenni preliminari sulla classe delle pagine ASP.NET.

Language
Indica il linguaggio .NET in uso nella pagina.

LinePragmas
Determina se il runtime deve generare pragma nel codice generato.

MasterPageFile
Specifica il file con estensione .master che funge da pagina master per una pagina master. L'attributo MasterPageFile viene utilizzato in una pagina master quando viene definita una pagina master figlio in uno scenario di pagine master nidificate. Per informazioni dettagliate, vedere Pagine master ASP.NET nidificate.

Src
Specifica il nome del file di origine della classe di codice sottostante da compilare in modo dinamico quando viene richiesta la pagina. possibile scegliere di includere la logica di programmazione per la pagina in una classe code-behind oppure nei Blocchi di dichiarazione del codice nel file aspx.

Strict
Indica se la pagina master deve essere compilata usando lopzione Option Strict di Visual Basic. Lattributo ignorato se il linguaggio scelto non Visual Basic.NET. Vale false per default.

sabato 6 luglio 2013 Pag. 79 / 151

SVILUPPARE UN SITO WEB ASP.NET

WarningLevel
Specifica il livello di avviso del compilatore in corrispondenza del quale interrompere la compilazione della pagina. I valori possibili sono compresi tra 0 e 4. Per ulteriori informazioni, vedere WarningLevel.

DIRETTIVA @PAGE
possibile utilizzare questa direttiva solo nelle pagine Web Form. possibile includere una sola direttiva @ Page in ogni file con estensione aspx. , inoltre, possibile definire un solo attributo Language per ogni direttiva @ Page

ATTRIBUTI

Async
Rende la pagina un gestore asincrono, ovvero la pagina utilizza un'implementazione di IHttpAsyncHandler per elaborare le richieste. L'impostazione predefinita false.

AsyncTimeOut
Definisce l'intervallo di timeout, espresso in secondi, utilizzato nell'elaborazione delle attivit asincrone. Il valore predefinito 45 secondi. Deve essere un valore integer.

AspCompat
Quando impostato su true, consente alla pagina di essere eseguita su un thread apartment a thread singolo (STA, Single-Threaded Apartment). In questo modo la pagina in grado di richiamare i componenti con threading Apartment singolo, ad esempio un componente sviluppato con Microsoft Visual Basic 6.0. Se si imposta questo attributo su true, dalla pagina sar inoltre possibile chiamare componenti COM+ versione 1.0 che richiedono l'accesso a oggetti incorporati ASP non gestiti. Tali oggetti sono accessibili mediante l'oggetto ObjectContext o il metodo OnStartPage. L'impostazione predefinita false. Nota: L'impostazione di questo attributo su true potrebbe influire negativamente sulle prestazioni della pagina. Per ulteriori informazioni, vedere la sezione "Note".

AutoEventWireup
Indica se gli eventi della pagina vengono connessi automaticamente. true indica che la connessione automatica degli eventi attivata, false indica invece il caso contrario. L'impostazione predefinita true. Per ulteriori informazioni, vedere Modello di eventi dei controlli server Web ASP.NET.

Buffer
Determina se il buffer delle risposte HTTP attivato. true indica che il buffer delle pagine attivato, false indica invece il caso contrario. L'impostazione predefinita true.

ClassName
Stringa che specifica il nome della classe per la pagina che verr compilata in modo dinamico quando verr richiesta. Per tale valore possibile utilizzare qualsiasi nome di classe valido e includere uno spazio dei nomi completo. Se non viene specificato un valore per questo attributo, il nome della classe per la pagina compilata si basa sul nome file della pagina e viene utilizzato lo spazio dei nomi predefinito ASP. Se un valore per l'attributo ClassName viene specificato senza un spazio dei nomi completo, verr utilizzato lo spazio dei nomi ASP, in combinazione con il nome della classe specificato per creare un nome di classe completo. Al nome della classe assegnato alla prima pagina pu fare riferimento un'altra pagina mediante la direttiva @Reference. Nota: Nella classe della pagina code-behind possibile fare riferimento a membri della classe della pagina aspx associata utilizzando il nome della classe completo per la pagina aspx. Tuttavia, se si precompila il sito con la protezione dell'origine attivata, la classe della pagina code-behind non si trova nello stesso assembly della classe della pagina aspx. Pertanto, il riferimento della classe nel file code-behind non funzioner. Per ulteriori informazioni sulla precompilazione, vedere Cenni preliminari sulla precompilazione in ASP.NET.
sabato 6 luglio 2013 Pag. 80 / 151

SVILUPPARE UN SITO WEB ASP.NET

ClientTarget
Indica l'agente utente di destinazione (generalmente un browser Web quale Microsoft Internet Explorer) per il quale necessario che i controlli server ASP.NET eseguano il rendering del contenuto. Per tale valore possibile utilizzare qualsiasi alias valido definito all'interno della sezione <clientTarget> del file di configurazione dell'applicazione.

CodeBehind
Specifica il nome del file compilato contenente la classe associata alla pagina. Questo attributo non viene utilizzato in fase di esecuzione. Nota: L'attributo incluso per garantire la compatibilit con le versioni precedenti di ASP.NET, per implementare la funzionalit code-behind. In ASP.NET versione 2.0, invece, necessario utilizzare l'attributo CodeFile per specificare il nome del file di origine, insieme all'attributo Inherits per specificare il nome completo della classe.

CodeFile
Specifica il percorso del file code-behind cui si fa riferimento per la pagina. Questo attributo viene utilizzato insieme all'attributo Inherits per associare un file di origine code-behind a una pagina Web. L'attributo valido solo per le pagine compilate.

CodeFileBaseClass
Specifica il nome del tipo di una classe base per una pagina e la classe code-behind a essa associata. Questo attributo facoltativo ma, quando viene utilizzato, necessario che sia presente anche l'attributo CodeFile. Utilizzare questo attributo se si intende implementare uno scenario condiviso in cui si definiscono campi comuni (e facoltativamente gli eventi associati) in una classe base per fare riferimento ai controlli dichiarati in una pagina Web. A causa del modello di generazione del codice ASP.NET, se i campi venissero definiti in una classe base senza utilizzare questo attributo, in fase di compilazione verrebbero generate nuove definizioni di membri per i controlli dichiarati nella pagina Web (all'interno di uno stub di classe parziale separato) e lo scenario desiderato non funzionerebbe. Se, tuttavia, si utilizza l'attributo CodeFileBaseClass per associare la classe base alla pagina e si fa in modo che la classe parziale (il cui nome assegnato all'attributo Inherits e al cui file di origine viene fatto riferimento dall'attributo CodeFile) erediti dalla classe base, i campi della classe base saranno in grado di fare riferimento ai controlli della pagina dopo la generazione di codice.

CodePage
Indica il valore dello schema di codifica utilizzato per la risposta. Si tratta di un valore integer che funge da ID per lo schema di codifica. Per un elenco dei possibili ID CodePage, vedere la classe Encoding.

CompilationMode
Imposta un valore che indica se la pagina deve essere compilata utilizzando una stringa che specifica una tra varie opzioni enumerate. Il valore predefinito Always, pertanto le pagine con estensione aspx vengono compilate per impostazione predefinita. Per informazioni dettagliate, vedere l'enumerazione CompilationMode.

CompilerOptions
Stringa contenente le opzioni del compilatore utilizzate per la compilazione della pagina. In C# e Visual Basic si tratta di una sequenza di opzioni della riga di comando del compilatore. Per ulteriori informazioni sulle opzioni del compilatore, vedere Opzioni del compilatore C# o Compilatore di Visual Basic.

ContentType
Definisce il tipo di contenuto HTTP della risposta come tipo MIME standard. Supporta qualsiasi stringa di tipo contenuto HTTP valida. Per un elenco dei valori possibili, eseguire la ricerca di MIME in MSDN Library (informazioni in lingua inglese).

Culture
Indica le impostazioni cultura per la pagina. Il valore di questo attributo deve essere un ID di impostazioni cultura valido. Si osservi che gli attributi LCID e Culture si escludono a vicenda,
sabato 6 luglio 2013 Pag. 81 / 151

SVILUPPARE UN SITO WEB ASP.NET

ovvero se si utilizza uno di questi attributi, non possibile utilizzare l'altro nella stessa pagina. Per ulteriori informazioni sui possibili valori di impostazioni cultura, vedere la classe CultureInfo.

Debug
Indica se necessario compilare la pagina con i simboli di debug. true indica che necessario compilare la pagina con i simboli di debug. false indica invece la situazione opposta. Questa impostazione influisce in modo significativo sulle prestazioni, pertanto preferibile che l'attributo sia impostato solo su true durante lo sviluppo.

Description
Fornisce una descrizione in formato testo della pagina. Questo valore viene ignorato dal parser ASP.NET.

EnableEventValidation
Attiva la convalida degli eventi negli scenari di callback e postback. true se gli eventi vengono sottoposti a convalida; in caso contrario, false. L'impostazione predefinita true. La convalida dell'evento della pagina riduce il rischio di richieste di postback e callback non autorizzati. Quando la propriet enableEventValidation impostata su true, ASP.NET consente solo gli eventi che possono essere generati nel controllo durante una richiesta di postback o un callback. Con questo modello, un controllo registra i relativi eventi durante il rendering e quindi li convalida durante la gestione di postback o callback. Tutti i controlli basati su eventi in ASP.NET utilizzano questa funzionalit per impostazione predefinita. Si consiglia di non disabilitare la convalida degli eventi. Prima di disabilitare la convalida degli eventi, verificare che non sia possibile creare alcun postbck che avrebbe effetti indesiderati sull'applicazione.

EnableSessionState
Definisce i requisiti di stato sessione per la pagina. true indica che lo stato sessione abilitato, ReadOnly indica che possibile leggere ma non modificare lo stato sessione. false indica invece che non abilitato. L'impostazione predefinita true. Per questi valori non necessario operare la distinzione tra caratteri maiuscoli e minuscoli. Per ulteriori informazioni, vedere la classe Cenni preliminare sullo stato della sessione ASP.NET.

EnableTheming
Indica se sulla pagina vengono utilizzati i temi. true se vengono utilizzati, in caso contrario false. L'impostazione predefinita true.

EnableViewState
Indica se lo stato della visualizzazione viene conservato su tutte le richieste di pagina. true indica che lo stato della visualizzazione viene mantenuto, false indica invece il caso contrario. L'impostazione predefinita true.

EnableViewStateMac
Indica che in ASP.NET necessario eseguire una verifica di autenticazione del computer (MAC) sullo stato della visualizzazione della pagina, quando la pagina viene rinviata dal client. true indica che lo stato della visualizzazione viene sottoposto alla verifica, false indica invece il caso contrario. Il valore predefinito true. Nota: Il codice MAC dello stato di visualizzazione una versione crittografata della variabile nascosta in cui viene reso permanente lo stato di visualizzazione di una pagina quando questa viene inviata al browser. Quando si imposta questo attributo su true, lo stato di visualizzazione crittografato viene controllato per verificare che non sia stato alterato dal client. Si osservi che l'impostazione di questo attributo su true incide sulle prestazioni in quanto il valore variabile deve essere decrittografato e crittografato per ciascun percorso di andata e ritorno della pagina.

ErrorPage
Definisce un URL di destinazione per il reindirizzamento se si verifica un'eccezione di pagina non gestita.

sabato 6 luglio 2013 Pag. 82 / 151

SVILUPPARE UN SITO WEB ASP.NET

Explicit
Determina se la pagina viene compilata utilizzando la modalit Option Explicit di Visual Basic. true indica che l'opzione di compilazione esplicita di Visual Basic attivata e che tutte le variabili devono essere dichiarate tramite un'istruzione Dim, Private, Public o ReDim; in caso contrario false. L'impostazione predefinita false. Nota: L'attributo viene ignorato dai linguaggi diversi da Visual Basic. Tale opzione viene inoltre impostata su true nel file di configurazione Machine.config. Per ulteriori informazioni, vedere File di configurazione del computer.

Inherits
Definisce una classe code-behind per la pagina da ereditare. Pu essere una classe qualsiasi derivata dalla classe Page. Questo attributo utilizzato con l'attributo CodeFile, che contiene il percorso del file di origine per la classe code-behind. L'attributo Inherits fa distinzione tra maiuscole e minuscole quando si utilizza C# come linguaggio della pagina, mentre non fa alcuna distinzione tra maiuscole e minuscole quando si utilizza Visual Basic. Se l'attributo Inherits non contiene uno spazio dei nomi, ASP.NET controlla se l'attributo ClassName contiene uno spazio dei nomi. In caso affermativo, ASP.NET tenta di caricare la classe a cui viene fatto riferimento nell'attributo Inherits utilizzando lo spazio dei nomi dell'attributo ClassName. (Si parte dal presupposto che l'attributo Inherits e l'attributo ClassName utilizzino entrambi lo stesso spazio dei nomi.) Per ulteriori informazioni sulle classi code-behind, vedere Modello di codice di pagine Web ASP.NET.

Language
Specifica il linguaggio utilizzato nella compilazione del rendering inline (<% %> e <%= %>) e dei blocchi di dichiarazione del codice all'interno della pagina. I valori possono rappresentare qualsiasi linguaggio supportato da .NET Framework, inclusi Visual Basic, C# o JScript. possibile utilizzare e specificare un solo linguaggio per pagina.

LCID
Definisce l'identificatore delle impostazioni locali per la pagina di Web Form. Nota: L'identificatore delle impostazioni locali un valore a 32 bit che definisce in modo univoco le impostazioni locali. ASP.NET utilizza le impostazioni locali predefinite del server Web a meno che non vengano specificate impostazioni diverse per una pagina di Web Form, utilizzando questo attributo. Si osservi che gli attributi LCID e Culture si escludono a vicenda, ovvero se si utilizza uno di questi attributi, non possibile utilizzare l'altro nella stessa pagina. Per ulteriori informazioni sulle impostazioni locali, effettuare una ricerca nella MSDN Library.

LinePragmas
Determina se il runtime deve generare pragma di linea nel codice sorgente. Si tratta di opzioni del compilatore spesso utilizzate dagli strumenti di debug per contrassegnare posizioni specifiche in un file di origine. true se i pragma di linea devono essere generati, in caso contrario false.

MaintainScrollPositionOnPostback
Indica se riportare l'utente nella stessa posizione nel browser client dopo il postback. true se gli utenti vengono riportati nella stessa posizione, in caso contrario false. L'impostazione predefinita false. Nota: Gli sviluppatori possono definire questo attributo per tutte le pagine impostando l'attributo maintainScrollPostitionOnPostback sull'elemento <pages> del file Web.config. Per l'impostazione dell'attributo nei file di configurazione rilevante la distinzione tra maiuscole e minuscole.

MasterPageFile
Imposta il percorso della pagina master per la pagina del contenuto o la pagina master nidificata. Supporta percorsi relativi e assoluti.

sabato 6 luglio 2013 Pag. 83 / 151

SVILUPPARE UN SITO WEB ASP.NET

ResponseEncoding
Indica il nome dello schema di codifica utilizzato per la risposta HTTP in cui presente il contenuto di una pagina. Il valore assegnato a questo attributo un nome di codifica valido. Per un elenco dei nomi di codifica possibili, vedere la classe Encoding. possibile ottenere un elenco degli ID e dei nomi di codifica possibili anche chiamando il metodo GetEncodings.

SmartNavigation
Indica se la pagina supporta la funzionalit "smart navigation" di Internet Explorer 5.5 o versione successiva. true se tale funzionalit attivata, in caso contrario false. L'impostazione predefinita false. inoltre possibile impostare la propriet SmartNavigation per la pagina nel codice ma, come regola generale, preferibile impostarla utilizzando l'attributo con la direttiva @ Page. Per ulteriori informazioni su come questa funzione migliora l'esplorazione delle pagine Web, vedere la propriet SmartNavigation.

Src
Specifica un percorso di un file di origine contenente codice collegato alla pagina. Nel file di origine collegato possibile scegliere di includere logica di programmazione per la pagina in una classe o nei blocchi di dichiarazione del codice. possibile utilizzare l'attributo Src per collegare i provider di compilazione alla pagina. Per ulteriori informazioni, vedere la classe BuildProvider. Nelle versioni di ASP.NET precedenti alla versione 2.0, inoltre, l'attributo Src veniva utilizzato come metodo alternativo per collegare un file code-behind a una pagina. In ASP.NET 2.0 l'approccio consigliato per il collegamento di un file di origine codebehind a una pagina consiste nell'utilizzare l'attributo Inherits per specificare una classe, insieme all'attributo CodeFile per specificare il percorso del file di origine per la classe.

Strict
Indica che la pagina deve essere compilata utilizzando la modalit Option Strict di Visual Basic. true se la modalit Option Strict attivata, in caso contrario false. L'impostazione predefinita false. Nota: L'attributo viene ignorato dai linguaggi diversi da Visual Basic.

StyleSheetTheme
Specifica un identificatore di tema valido da utilizzare per la pagina. Quando impostato l'attributo StyleSheetTheme, i singoli controlli possono eseguire l'override delle impostazioni stilistiche contenute in un tema. In questo modo un tema pu fornire l'aspetto di insieme di un sito, mentre le impostazioni contenute nell'attributo StyleSheetTheme consentono di personalizzare impostazioni specifiche su una pagina e sui rispettivi singoli controlli.

TargetSchema
Specifica il nome di uno schema che convalida il contenuto sulla pagina. Lo scopo di questo attributo di carattere esclusivamente descrittivo, non viene eseguita alcuna convalida effettiva e l'attributo viene ignorato dal parser.

Theme
Specifica un identificatore di tema valido da utilizzare per la pagina. Quando viene impostato senza utilizzare l'attributo StyleSheetTheme, l'attributo Theme esegue l'override delle singole impostazioni di stile sui controlli, consentendo di conferire un aspetto uniforme e coerente a una pagina.

Title
Specifica un titolo per la pagina di cui viene eseguito il rendering all'interno dei tag HTML <title> nella risposta. possibile accedere al titolo anche a livello di codice come propriet della pagina. Per informazioni dettagliate, vedere la propriet Title.

Trace
Indica se attivata la funzione di analisi. true se attivata, in caso contrario false. L'impostazione predefinita false. Per ulteriori informazioni, vedere Cenni preliminari sull'analisi di ASP.NET.
sabato 6 luglio 2013 Pag. 84 / 151

SVILUPPARE UN SITO WEB ASP.NET

TraceMode
Indica il modo in cui visualizzare i messaggi di analisi per la pagina quando la funzione di analisi attivata. I valori possibili sono SortByTime e SortByCategory. Quando la funzione di analisi attivata, l'impostazione predefinita SortByTime. Per ulteriori informazioni sulla funzione di analisi, vedere Cenni preliminari sull'analisi di ASP.NET.

Transaction
Indica se le transazioni sono supportate nella pagina. Tra i possibili valori sono compresi Disabled, NotSupported, Supported, Required e RequiresNew. L'impostazione predefinita Disabled.

UICulture
Specifica le impostazioni cultura dell'interfaccia utente da utilizzare per la pagina. Viene supportato qualunque valore di impostazioni cultura di UI valido.

ValidateRequest
Indica se eseguire la convalida delle richieste. Se l'impostazione true, la convalida delle richieste viene eseguita su tutti i dati di input sulla base di un elenco hardcoded dei valori potenzialmente pericolosi. Se viene rilevata una corrispondenza, viene generata un'eccezione HttpRequestValidationException. L'impostazione predefinita true. Questa funzionalit abilitata nel file di configurazione del computer (Machine.config). possibile disabilitarla nel file di configurazione dell'applicazione (Web.config) o nella pagina impostando questo attributo su false. Nota: Questa funzionalit consente di ridurre il rischio di attacchi di script su pi siti per le pagine e le applicazioni ASP.NET semplici. Un'applicazione che non convalida correttamente l'input dell'utente pu essere soggetta a diversi tipi di attacco dovuti a input con formato non valido, inclusi gli attacchi di script su pi siti e di inserimento di Microsoft SQL Server. Non esiste una soluzione alternativa all'attenta valutazione di tutte le forme di input per un'applicazione e al controllo che tale input venga convalidato o codificato in modo corretto oppure che l'applicazione venga chiusa prima dell'utilizzo dei dati o della restituzione di informazioni al client.

ViewStateEncryptionMode
Determina la modalit di crittografia dello stato di visualizzazione, con tre possibili valori numerati: Auto, Always, o Never. L'impostazione predefinita Auto, ovvero lo stato di visualizzazione verr crittografato se un controllo singolo lo richiede. Per ulteriori informazioni, vedere l'enumerazione ViewStateEncryptionMode.

WarningLevel
Indica il livello di avviso del compilatore raggiunto il quale questo considera gli avvisi come errori interrompendo la compilazione della pagina. I livelli di avviso possibili sono compresi tra 0 e 4. Per ulteriori informazioni, vedere la propriet WarningLevel.

PROPRIET AUTOPOSTBACK
POSTBACK
In una pagina dinamica (server side) Asp.Net utilizza la tecnica PostBack per individuare se la pagina invia informazioni a se stessa o se caricata da unaltra pagina. La postback architecture ci da la possibilit di realizzare pagine HTML contenenti controlli con cui l'utente pu interagire. I controlli scatenano eventi ed compito dello sviluppatore realizzare gli opportuni gestori di eventi per gestire l'interazione. Quando effettuiamo la richiesta di una web form, vengono sollevati gli eventi: 1. Page_Init generato quando la pagina viene inizializzata 2. Page_Load generato quando la pagina viene caricata 3. Control Event generato se un comando (ad esempio un pulsante) ha inviato la pagina al server 4. Page_Unload generato quando la pagina viene scaricata dalla memoria Per gestire l'evento Page_Load, si ricorre di frequente alla propriet IsPostBack della classe Page. Se IsPostBack vera, ci troviamo in un contesto di postback, vale a dire che la pagina stata caricata una prima
sabato 6 luglio 2013 Pag. 85 / 151

SVILUPPARE UN SITO WEB ASP.NET

volta ed stata poi inviata al server in seguito al verificarsi di un evento sul client. Se IsPostBack falsa, la pagina stata caricata per la prima volta.

VIEWSTATE
Il viewstate la tecnica che usa asp.net per tenere traccia dello stato tra un postback ed un altro: il sistema codifica le informazioni in una stringa e le conserva in un campo hidden, quindi lo usa per riportare i controlli o meglio i valori dei controlli allo stato in cui si trovavano prima del postback. Quando serve abilitare il viewstate? In genere necessario solo nei form dove sono presenti webcontrol popolati con il DataBind da una fonte dati come dropdownlist, listbox e simili (se questi web control sono popolati da codice, possiamo disabilitare tranquillamente il viewstate), altrimenti il suo uso inutile e addirittura dannoso visto che appesantisce, e in molti casi notevolmente, la pagina. Per disabilitarlo a livello di applicazione, inserire nel web.config della root:

<configuration> <system.web> <pages enableViewState="false" /> </system.web> </configuration>


Quindi, nelle pagine in cui serve: <%@ Page enableViewState="true" %> Il viewstate abilitato comunque necessario in presenza di webcontrol che effettuano il postback come i Button, LinkButton, webcontrol vari che permettono l'autoPostBack, DataGrid e cos via.

AUTOPOSTBACK
In alcuni controlli web, la propriet chiamata server quando un evento accade nel controllo.

AutoPostBack, se impostata a true, invier la richiesta al

Ad esempio: se una casella a discesa (DropdownBox) ha la propriet AutoPostBack impostata su true, ogni volta che lutente modifica la selezione, questo evento sar gestito nel server, vale a dire che una richiesta verr inviata al server. Perch abbiamo bisogno di inviare una richiesta al server, in questo caso? Consideriamo questo scenario in cui la pagina web viene utilizzata dall'utente per l'inserimento di informazioni. La pagina contiene due controlli DropdownBox, Stato e Citt. Quando l'utente seleziona Stato, le opportune Citt devono essere inserite nel combo box caricato dal database. Per avere questo risultato, occorre impostare la propriet AutoPostBack del controllo Stato su true. In tal modo siamo in grado di gestire l'evento dal lato server e scrivere il codice per popolare la casella Citt con i valori del database. Facciamo un altro esempio. Si consideri una pagina di accesso, che contiene TextBox IDUtente, NomeUtente e Password, in cui NomeUtente non modificabile. Quando l'utente immette l'IDUtente e fa Click, il suo nome dovrebbe essere visualizzato nel campo di testo NomeUtente. Per raggiungere tale obiettivo dobbiamo impostare a vero la propriet AutoPostBack della casella di testo IDUtente e gestire l'evento lato server, scrivendo il codice per recuperare dal database il NomeUtente per quel IDUtente, che viene prelevato dalla casella di testo IDUtente. Come funziona? Ogni volta che un controllo settato su AutoPostBack, NET Framework automaticamente inserisce alcune righe di codice allinterno dellHTML generato: a. b. c. una variabile nascosta, denominata __EVENTTARGET che dice al server quale controllo interessato allevento una variabile nascosta, denominata __EVENTARGUMENT per fornire sullevento ulteriori informazioni a cui il server deve accedere Un metodo basato su Javascript denominato

__doPostBack (eventtarget,

eventargument)
inserito nel sorgente HTML per l'attuazione della funzionalit autopostback. I due parametri eventtarget e eventargument fanno il lavoro effettivo di selezionare il controllo per gestire l'evento: eventtarget conterr il nome del controllo che avvia il postback e eventargument conterr i parametri aggiuntivi. d. un evento JavaScript

OnChange per il controllo


sabato 6 luglio 2013 Pag. 86 / 151

SVILUPPARE UN SITO WEB ASP.NET

gestisce levento OnChange dal lato client chiamando levento nome del controllo in cui levento OnChange si verificato

__doPostBack con il

ISPOSTBACK
una propriet della classe Page che determina se ci si trova in una situazione di postback. Utilizzata per esempio quando si desidera caricare alcune informazioni quando la pagina viene caricata per la prima volta.

CONTROLLO CONTENTPLACEHOLDER
Il controllo ContentPlaceHolder definisce un'area relativa per il contenuto in una pagina master ed esegue il rendering di tutto il testo, il codice e i controlli server da un controllo Content correlato individuato in una pagina di contenuto.

Content associato a un controllo ContentPlaceHolder mediante la propriet ContentPlaceHolderID. Impostare la propriet ContentPlaceHolderID sul valore della propriet ID del controllo ContentPlaceHolder correlato in una pagina master.
Il controllo In una pagina master possibile dichiarare pi controlli ContentPlaceHolder. Per ulteriori informazioni sulle pagine master, vedere Pagine master ASP.NET.

CONTROLLO CONTENTPLACEHOLDERID
Ottiene o imposta l'ID del controllo

ContentPlaceHolder associato al contenuto corrente.

Tutto il contenuto incapsulato dal controllo Content viene sottoposto al rendering all'interno del controllo ContentPlaceHolder di riferimento in una pagina master.

CONTROLLO CALENDAR
Visualizza un calendario che mostra un solo mese ma consente il passaggio al mese successivo o a quello precedente. I giorni sul mese mostrato sono di default selezionabili. possibile specificare se il controllo Calendar consente la selezione di un giorno, di una settimana o di un mese intero impostando la propriet SelectionMode, che accetta:

Day DayWeek DayWeekMonth None

possibile selezionare una singola data. possibile selezionare una singola data o un'intera settimana. possibile selezionare una singola data, settimana o mese intero. Non possibile selezionare alcuna data.

Per maggiori informazioni vedere http://msdn.microsoft.com/it-it/library/system.web.ui.webcontrols.calendar(VS.80).aspx.

CONTROLLO LITERAL
Utilizzare il controllo System.Web.UI.WebControls.Literal per riservare una posizione nella pagina Web in corrispondenza della quale visualizzare il testo. Il funzionamento del controllo Literal simile a quello del controllo Label; tuttavia il controllo Literal non consente di applicare uno stile al testo visualizzato (viene applicato lo stile del contesto in cui si trova). possibile determinare a livello di codice il testo visualizzato nel controllo impostando la propriet Text.

CONTROLLO ACCESSDATASOURCE
La classe AccessDataSource un controllo origine dati che funziona con i database di Microsoft Access. Analogamente alla relativa classe base, SqlDataSource, il controllo AccessDataSource utilizza le query SQL per eseguire il recupero dei dati. Con questo controllo non occorre impostare la propriet ConnectionString. Impostando semplicemente la posizione del file di Access (.mdb) nella propriet DataFile, la classe AccessDataSource esegue la connessione sottostante al database. necessario inserire i database di Access nella directory App_Data (o mdb-database, vedere istruzioni del provider di pubblicazione) del sito Web e fare riferimento a questi database utilizzando un percorso relativo, ad esempio ~/App_Data/Northwind.mdb: questa posizione offre ulteriore
sabato 6 luglio 2013 Pag. 87 / 151

SVILUPPARE UN SITO WEB ASP.NET

sicurezza per i file di dati, in quanto se vengono richiesti direttamente dal browser Web del client non sono resi disponibili.

ProviderName in sola lettura. Quando si utilizza il provider System.Data.OleDb, l'ordine dei parametri di
un'istruzione SQL con parametri importante; tutte le query SQL con parametri specificate nelle propriet SelectCommand, UpdateCommand, InsertCommand e DeleteCommand devono corrispondere all'ordine di tutti gli oggetti Parameter che si trovano nell'insieme dei parametri corrispondente. Per ulteriori informazioni vedere in MSDN Utilizzo dei parametri con il controllo SqlDataSource. La classe AccessDataSource non supporta la connessione ai database di Access che sono protetti mediante un nome utente o una password. Se il database di Access protetto mediante un nome utente o una password, utilizzare il controllo SqlDataSource in modo da poter specificare una stringa di connessione completa. Nella tabella riportata di seguito sono descritte le funzionalit del controllo AccessDataSource. Funzionalit Ordinamento Filtraggio Paging Requisiti Impostare la propriet DataSourceMode sul valore DataSet. Impostare la propriet FilterExpression su un'espressione di filtraggio utilizzata per filtrare i dati quando viene chiamato il metodo Select. AccessDataSource non supporta le operazioni di paging dirette in un database di Access. Un controllo con associazione ai dati, ad esempio la classe GridView, pu eseguire il paging delle voci restituite da AccessDataSource, se la propriet DataSourceMode impostata sul valore DataSet. Impostare la propriet UpdateCommand su un'istruzione SQL utilizzata per aggiornare i dati. In genere questa istruzione parametrizzata. Impostare la propriet DeleteCommand su un'istruzione SQL utilizzata per eliminare i dati. In genere questa istruzione parametrizzata. Impostare la propriet InsertCommand su un'istruzione SQL utilizzata per inserire i dati. In genere questa istruzione parametrizzata. Impostare la propriet DataSourceMode sul valore DataSet, la propriet EnableCaching su true e le propriet CacheDuration e CacheExpirationPolicy in base al comportamento di memorizzazione nella cache che si desidera utilizzare per tutti i dati memorizzati nella cache.

Utilizza

sempre

lo

stesso

provider,

System.Data.OleDb .NET, per questo

motivo, la propriet

Aggiornament o Eliminazione Inserimento Cache

DataSourceID del controllo con associazione ai dati.

I controlli con associazione ai dati vengono associati a una classe AccessDataSource utilizzando la propriet

Principali propriet (per il riferimento completo vedere http://msdn.microsoft.com/itit/library/system.web.ui.webcontrols.accessdatasource_members.aspx)


DataFile DataSourceMode Ottiene o imposta la posizione del file mdb di Microsoft Access. Ottiene o imposta la modalit di recupero dati utilizzata dal controllo SqlDataSource per recuperare dati. I membri della propriet sono DataReader (per la sola lettura) e

DataSet
ID SelectCommand Ottiene o imposta l'identificatore a livello di programmazione assegnato al controllo server. Ottiene o imposta la stringa SQL utilizzata dal controllo SqlDataSource per recuperare dati dal database sottostante. Ottiene o imposta un valore che indica se il controllo visualizzato.

Visible

Nell'esempio di codice riportato di seguito viene illustrato uno scenario di visualizzazione e aggiornamento comune con il controllo GridView. La propriet SelectCommand impostata su una query SQL appropriata e i dati del database Northwind vengono visualizzati nel controllo GridView. Poich viene anche specificata una propriet UpdateCommand e la propriet AutoGenerateEditButton impostata su true possibile modificare e aggiornare i record senza ulteriore codice.
sabato 6 luglio 2013 Pag. 88 / 151

SVILUPPARE UN SITO WEB ASP.NET

<%@Page Language="VB" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html > <head runat="server"> <title>ASP.NET Example</title> </head> <body> <form id="form1" runat="server"> <asp:accessdatasource id="AccessDataSource1" runat="server" datasourcemode="DataSet" datafile="~/App_Data/Northwind.mdb" selectcommand="SELECT EmployeeID,FirstName,LastName,Title FROM Employees" updatecommand="Update Employees SET FirstName=?,LastName=?,Title=? WHERE EmployeeID=@EmployeeID"> </asp:accessdatasource> <asp:gridview id="GridView1" runat="server" autogeneratecolumns="False" datakeynames="EmployeeID" autogenerateeditbutton="True" datasourceid="AccessDataSource1"> <columns> <asp:boundfield headertext="First Name" datafield="FirstName" /> <asp:boundfield headertext="Last Name" datafield="LastName" /> <asp:boundfield headertext="Title" datafield="Title" /> </columns> </asp:gridview> </form> </body> </html>

CONTROLLO GRIDVIEW
Visualizza i valori di un'origine dati in una tabella in cui ogni colonna rappresenta un campo e ogni riga rappresenta un record. Il controllo GridView consente la selezione, l'ordinamento e la modifica degli elementi. Ogni colonna nel controllo rappresentata da un oggetto DataControlField. Per impostazione predefinita, la propriet AutoGenerateColumns impostata su true e crea un oggetto AutoGeneratedField per ciascun campo dell'origine dati. anche possibile definire manualmente i campi colonna da visualizzare nel controllo GridView impostando la propriet AutoGenerateColumns su false e definendo quindi un insieme di campi colonna personalizzato. Diversi tipi di campi colonna determinano il comportamento delle colonne nel controllo. Nella tabella riportata di seguito sono elencati i diversi tipi di campi colonna che possibile utilizzare.
Tipo di campo colonna BoundField

Descrizione Visualizza il valore di un campo in un'origine dati. Si tratta del tipo di colonna predefinito del controllo GridView. Visualizza un pulsante di comando per ciascun elemento nel controllo GridView. In questo modo possibile creare una colonna di pulsanti personalizzati, ad esempio i pulsanti Aggiungi o Rimuovi. Visualizza una casella di controllo per ciascun elemento nel controllo GridView. Questo tipo di campo colonna viene in genere utilizzato per visualizzare i campi con un valore booleano. Visualizza pulsanti di comando predefiniti per l'esecuzione di operazioni di selezione, modifica o
sabato 6 luglio 2013 Pag. 89 / 151

ButtonField

CheckBoxField

CommandField

SVILUPPARE UN SITO WEB ASP.NET

eliminazione. HyperLinkField Visualizza il valore di un campo in un'origine dati come collegamento ipertestuale. Questo tipo di campo colonna consente di associare un secondo campo all'URL del collegamento ipertestuale. Visualizza un'immagine per ciascun elemento nel controllo GridView. Visualizza contenuto definito dall'utente per ciascun elemento nel controllo GridView in base a un modello specificato. Questo tipo di campo colonna consente di creare un campo colonna personalizzato.

ImageField TemplateField

Per definire un insieme di campi colonna in modo dichiarativo, aggiungere innanzitutto tag <Columns> di apertura e di chiusura tra i tag di apertura e di chiusura del controllo GridView. Elencare quindi i campi colonna che si desidera includere tra i tag <Columns> di apertura e di chiusura. Le colonne specificate sono aggiunte all'insieme Columns nell'ordine di elencazione. L'insieme Columns contiene tutti i campi colonna del controllo e consente di gestire a livello di codice i campi colonna nel controllo GridView.

CONTROLLO DETAILSVIEW
Il controllo DetailsView offre una funzionalit che trasforma i dati visualizzati in una tabella (<table>) HTML con due colonne e una riga per ciascuna colonna o propriet associata al controllo. Come in GridView, in DetailsView verr inserito un BoundField per ciascuna propriet dell'oggetto restituita dal metodo Select di ObjectDataSource. La sola differenza che i BoundField di DetailsView sono disposti orizzontalmente e non verticalmente. DetailsView visualizza solo il primo record restituito dall'origine dati. Per far s che l'utente possa scorrere i record uno alla volta, necessario attivare il paging in DetailsView. Per farlo, in Visual Studio selezionare la casella di controllo Attiva paging nello smart tag di DetailsView. Una descrizione molto chiara su questo controllo si trova in http://www.microsoft.com/italy/msdn/library/net/aspnet/detailsview.htm.

CONTROLLO MULTIVIEW
I controlli server Web MultiView e presentare visualizzazioni alternative.

View fungono da contenitori per altri controlli e tag e consentono di View, allinterno dei quali

Il controllo MultiView funge da contenitore esterno per uno o pi controlli pu essere contenuta qualsiasi combinazione di tag e controlli.

L'indice di un controllo View determinato dall'ordine in cui viene dichiarato in un controllo MultiView. Ad esempio, il primo controllo View dichiarato in un controllo MultiView ha indice 0. Si pu rendere visibile il contenuto di un solo controllo View per volta, impostando la propriet ActiveViewIndex del controllo MultiView o utilizzando allinterno del codice il metodo SetActiveView. Il metodo

MultiView.GetActiveView restituisce il controllo View attivo corrente.

Per consentire lo spostamento tra i controlli View di un controllo MultiView, possibile aggiungere un controllo LinkButton o Button a ciascun controllo View. Per sfruttare la funzionalit di aggiornamento automatico del controllo MultiView fornita dal controllo View attivo, impostare la propriet CommandName del pulsante o del pulsante di collegamento sul valore di uno dei seguenti campi di nome di comando corrispondente al comportamento di spostamento desiderato: PreviousViewCommandName, NextViewCommandName, SwitchViewByIDCommandName o SwitchViewByIndexCommandName.

CONTROLLO LOGINVIEW
Il controllo LoginView fa da contenitore per altri controlli e pu essere configurato per mostrare le informazioni circa lo stato del visitatore del sito. Pu avere tre propriet di modello: AnonymousTemplate da visualizzare agli utenti che non hanno eseguito l'accesso al sito Web. Non verr visualizzato agli utenti che si sono accreditati. LoggedInTemplate da visualizzare agli utenti che si sono accreditati, ma che non appartengono ad alcun gruppo di ruolo con modelli predefiniti.
sabato 6 luglio 2013 Pag. 90 / 151

SVILUPPARE UN SITO WEB ASP.NET

RoleGroups

da visualizzare agli utenti che si sono accreditati e che sono membri di ruoli con modelli definiti per il gruppo di ruolo. I modelli di contenuto sono associati a insiemi specifici di ruoli nelle istanze RoleGroup.

Viene visualizzato il testo contenuto allinterno di ogni modello, e se incluso il controllo anche il nome dellutente connesso. Vediamo un esempio: <asp:LoginView ID="LoginView1" runat="server"> <AnonymousTemplate>Utente non Accreditato</AnonymousTemplate> <LoggedInTemplate>Utente Accreditato: <asp:LoginName ID="LoginName1" runat="server" /> </LoggedInTemplate> <RoleGroups> <asp:RoleGroup Roles="Amministratori"> <ContentTemplate Utente Accreditato come Amministratore: <asp:LoginName ID="LoginName1" runat="server" /> </ContentTemplate> </asp:RoleGroup> </RoleGroups> </asp:LoginView>

asp:LoginName,

Vedere http://msdn.microsoft.com/it-it/library/system.web.ui.webcontrols.loginview(VS.80).aspx.

OGGETTO OBJECTDATASOURCE
http://msdn.microsoft.com/it-it/library/cc185063.aspx http://www.visual-basic.it/articoli/acmdgTutAspNet03.htm http://www.visual-basic.it/articoli/acmdgTutAspNet04.htm http://www.visual-basic.it/articoli/acmdgTutAspNet05.htm

CLASSE TEMPLATEFIELD
La classe TemplateField utilizzata da controlli con associazione a dati (ad esempio, GridView e DetailsView) per visualizzare contenuto personalizzato per ciascun record visualizzato. L'oggetto TemplateField viene visualizzato in modo diverso a seconda del controllo con associazione a dati in cui viene utilizzato. Il controllo GridView, ad esempio, consente di visualizzare un oggetto TemplateField come una colonna, mentre il controllo DetailsView lo visualizza come una riga. possibile nascondere un oggetto TemplateField in un controllo con associazione a dati impostando la propriet Visible su false. Per maggiorni informazioni vedere http://msdn.microsoft.com/itit/library/system.web.ui.webcontrols.templatefield(VS.80).aspx.

CLASSE COMMANDFIELD GridView e DetailsView) per visualizzare i pulsanti di comando che eseguono operazioni di eliminazione,
modifica, inserimento o selezione. I pulsanti di comando per l'esecuzione di queste operazioni possono essere visualizzati o nascosti. Quando viene utilizzato insieme a un controllo origine dati (ad esempio un controllo SqlDataSource o AccessDataSource), pu avvalersi delle funzionalit di questo e fornire funzionalit automatiche di eliminazione, aggiornamento e inserimento. Per le altre origini dati, necessario fornire le routine per eseguire queste operazioni durante gli eventi appropriati per il controllo con associazione a dati. Il campo CommandField viene visualizzato in modo diverso a seconda del controllo con associazione a dati nel quale viene utilizzato. Ad esempio, mediante il controllo GridView il campo CommandField viene visualizzato sotto forma di colonna, mentre mediante il controllo DetailsView viene visualizzato sotto forma di riga. La classe CommandField un campo speciale utilizzato dai controlli con associazione a dati (ad esempio

CLASSE CONTENT ContentPlaceHolder in una pagina master. CLASSE MENU


Visualizza un menu in una pagina Web ASP.NET.
sabato 6 luglio 2013 Pag. 91 / 151

Contiene

controlli

di

testo,

di

tag

server

per

eseguire

il

rendering

di

un

controllo

SVILUPPARE UN SITO WEB ASP.NET

http://msdn.microsoft.com/it-it/library/system.web.ui.webcontrols.menu.aspx

CLASSE SITEMAPPATH
Visualizza un set di testi o immagini con collegamenti ipertestuali che consentono agli utenti di spostarsi pi facilmente all'interno di un sito, pur occupando una quantit minima di spazio nella pagina. http://msdn.microsoft.com/it-it/library/system.web.ui.webcontrols.sitemappath.aspx

CLASSE MEMBERSHIP
Spazio dei nomi: System.Web.Security Assembly: System.Web (in System.Web.dll) La classe Membership utilizzata nelle applicazioni ASP.NET per convalidare le credenziali degli utenti e per gestire le impostazioni utente, come ad esempio la password e l'indirizzo di posta elettronica. La classe Membership pu essere utilizzata in modo autonomo o insieme alla classe FormsAuthentication per creare un sistema completo di autenticazione degli utenti di un'applicazione o di un sito Web. Il controllo Login incapsula la classe Membership per fornire un efficace meccanismo di convalida degli utenti. La classe Membership dotata di strumenti che consentono di svolgere le seguenti operazioni: Creazione di nuovi utenti. Memorizzazione delle informazioni di appartenenza (nomi utente, password, indirizzi di posta elettronica e dati di supporto) in Microsoft SQL Server o in un archivio dati alternativo. Autenticazione degli utenti che accedono al sito. possibile autenticare gli utenti a livello di codice; in alternativa, anche possibile utilizzare il controllo Login per creare un sistema completo di autenticazione che richiede una quantit minima o nulla di codice. Operazioni di gestione delle password (quali ad esempio creazione, modifica, recupero e reimpostazione). Se lo si desidera, possibile configurare l'appartenenza ASP.NET in modo da implementate una domanda e una risposta relative alla password per consentire agli utenti che abbiano dimenticato la password di reimpostarla o recuperarla. Nell'esempio di codice riportato qui viene illustrata la pagina di accesso di un'applicazione ASP.NET configurata per l'utilizzo dell'autenticazione basata su form e dell'appartenenza ASP.NET. Se le credenziali fornite dall'utente non sono valide, viene visualizzato un messaggio. Altrimenti, l'utente viene reindirizzato all'URL inizialmente richiesto mediante il metodo RedirectFromLoginPage.

METODI
Nome CreateUser Descrizione Sottoposto a overload. Aggiunge un nuovo utente all'archivio dati e restituisce un oggetto MembershipUser relativo all'utente appena creato. Se la creazione dell'utente non viene eseguita, viene generata un'eccezione MembershipCreateUserException. possibile recuperare un valore MembershipCreateStatus dalla propriet StatusCode dell'eccezione MembershipCreateUserException che indica il motivo per cui la creazione non riuscita. Sottoposto a overload. Elimina un utente dal database. Sottoposto a overload. Ottiene un insieme degli utenti di appartenenza in cui l'indirizzo di posta elettronica contiene l'indirizzo specificato di cui verificare la corrispondenza. Sottoposto a overload. Ottiene un insieme degli utenti di appartenenza in cui il nome utente contiene il nome specificato di cui verificare la corrispondenza. Genera una password casuale con la lunghezza specificata. Sottoposto a overload. Ottiene un insieme degli utenti nel database. I risultati restituiti dal metodo GetAllUsers possono essere vincolati dai parametri pageIndex e pageSize. Il parametro pageSize identifica il numero massimo di oggetti MembershipUser da restituire in MembershipUserCollection. Il parametro pageIndex consente l'identificazione della pagina di risultati da restituire, dove 0 identifica la prima pagina. totalRecords un parametro out impostato sul numero totale di utenti di appartenenza dell'applicazione applicationName. Se ad esempio per l'applicazione
sabato 6 luglio 2013 Pag. 92 / 151

DeleteUser FindUsersByEmail

FindUsersByName

GeneratePassword GetAllUsers

SVILUPPARE UN SITO WEB ASP.NET

Nome

Descrizione applicationName configurata sono presenti 13 utenti e i parametri pageIndex e pageSize sono impostati rispettivamente su 1 e 5, l'oggetto MembershipUserCollection restituito conterr gli utenti compresi tra il sesto e il decimo. Il parametro totalRecords verr impostato su 13.

GetNumberOfUsersOnline GetUser

Ottiene il numero corrente di utenti connessi a un'applicazione. Sottoposto a overload. Ottiene le informazioni di un utente di appartenenza dall'origine dati. Ottiene il nome di un utente il cui indirizzo di posta elettronica corrisponde all'indirizzo di posta elettronica specificato. Aggiorna il database con le informazioni dell'utente specificato. Il metodo UpdateUser accetta come input un oggetto MembershipUser compilato con le informazioni correnti dell'utente di appartenenza e aggiorna l'origine dati con i valori di propriet dell'oggetto MembershipUser. Verifica che nome utente e password forniti siano validi.

GetUserNameByEmail

UpdateUser

ValidateUser

PROPRIET
Nome ApplicationName EnablePasswordReset Descrizione Ottiene o imposta il nome dell'applicazione. Ottiene un valore che indica se il provider di appartenenze corrente configurato in modo da consentire agli utenti di reimpostare le loro password. Ottiene un valore che indica se il provider di appartenenze corrente configurato in modo da consentire agli utenti di recuperare le loro password. Identificatore password. dell'algoritmo utilizzato per la codifica hash delle

EnablePasswordRetrieval

HashAlgorithmType

MaxInvalidPasswordAttempts

Ottiene il numero massimo di tentativi non validi di immissione della password o della risposta per la password prima che l'utente di appartenenza venga bloccato.

MinRequiredNonAlphanumericCharacters Ottiene il numero minimo di caratteri speciali che devono essere presenti affinch la password sia valida. MinRequiredPasswordLength PasswordAttemptWindow Ottiene la lunghezza minima di una password. Ottiene l'intervallo di tempo in cui vengono registrati i tentativi consecutivi non riusciti di fornire una password valida o una risposta per la password. Ottiene l'espressione regolare utilizzata per valutare una password. Ottiene un riferimento al provider di appartenenze predefinito per l'applicazione. Ottiene un insieme dei provider di appartenenze per l'applicazione ASP.NET. Ottiene un valore che indica se il provider di appartenenze predefinito richiede agli utenti di rispondere a una domanda per la password prima di consentire la reimpostazione e il recupero della password. Specifica il lasso di tempo in minuti a partire dall'indicatore di ultima data e ora di attivit dell'utente durante il quale l'utente considerato in linea.
sabato 6 luglio 2013 Pag. 93 / 151

PasswordStrengthRegularExpression Provider

Providers

RequiresQuestionAndAnswer

UserIsOnlineTimeWindow

SVILUPPARE UN SITO WEB ASP.NET

EVENTI
Nome ValidatingPassword Descrizione Si verifica alla creazione di un utente, al cambiamento di una password o alla reimpostazione di una password.

CLASSE MEMBERSHIPUSER
Spazio dei nomi: System.Web.Security Assembly: System.Web (in System.Web.dll) L'oggetto MembershipUser utilizzato per rappresentare un unico utente di appartenenza nell'archivio dati di appartenenze. Espone le informazioni sugli utenti di appartenenza, come ad esempio l'indirizzo di posta elettronica, e fornisce all'utente funzionalit quali la possibilit di cambiare o reimpostare la password.

COSTRUTTORI
Nome Descrizione

MembershipUser Sottoposto a overload. Crea un nuovo oggetto utente di appartenenza con i valori di propriet specificati. Costruttore MembershipUser (String, String, Object, String, String, String, Boolean, Boolean, DateTime, DateTime, DateTime, DateTime, DateTime) Crea un nuovo oggetto utente di appartenenza con i valori di propriet specificati. Parametri ProviderName Tipo: System.String - nome del provider di appartenenze in cui sono memorizzate e da cui vengono recuperate le informazioni sugli utenti di appartenenza. UserName Tipo: System.String - nome di accesso dell'utente di appartenenza. ProviderUserKey Tipo: System.Object - identificatore univoco dell'utente dall'origine dati di appartenenze dell'utente. La propriet ProviderUserKey espone l'identificatore dell'origine dati di appartenenze tipizzato come object. Email Tipo: System.String - l'indirizzo di posta elettronica dell'utente di appartenenza PasswordQuestion Tipo: System.String - domanda per la password dell'utente di appartenenza Comment Tipo: System.String - informazioni specifiche dell'applicazione relative all'utente di appartenenza IsApproved Tipo: System.Boolean - valore che indica se possibile autenticare l'utente di appartenenza. Se la propriet IsApproved restituisce false, il metodo ValidateUser restituisce false anche se il nome utente e la password forniti sono corretti. isLockedOut Tipo: System.Boolean - true per bloccare l'utente di appartenenza; in caso contrario, false. CreationDate Tipo: System.DateTime - data e ora in cui l'utente stato aggiunto all'archivio dati di appartenenze LastLoginDate Tipo: System.DateTime - la data e l'ora dell'ultima autenticazione dell'utente LastActivityDate Tipo: System.DateTime - la data e l'ora pi recenti in cui l'utente di appartenenza stato autenticato o ha effettuato un accesso all'applicazione lastPasswordChangedDate Tipo: System.DateTime - data e ora in cui stato effettuato l'ultimo aggiornamento della password dell'utente di appartenenza LastLockoutDate Tipo: System.DateTime - la data e l'ora dell'ultimo blocco dell'utente di appartenenza. Nella maggior parte dei casi gli utenti vengono bloccati quando si raggiunge il valore della propriet MaxInvalidPasswordAttempts all'interno della finestra PasswordAttemptWindow. Gli utenti possono essere bloccati anche se si utilizza l'overload del metodo GetPassword o ResetPassword che accetta una risposta per la password e il numero di tentativi non validi di immissione raggiunge il valore della propriet Membership.MaxInvalidPasswordAttempts entro l'intervallo di tempo specificato nella propriet Membership.PasswordAttemptWindow. (nei link dei parametri che ne hanno si trovano esempi di codice)

sabato 6 luglio 2013 Pag. 94 / 151

SVILUPPARE UN SITO WEB ASP.NET

METODI
Nome ChangePassword Descrizione Aggiorna la password dell'utente di appartenenza nell'archivio dati di appartenenze.

ChangePasswordQuestionAndAnswer Aggiorna la domanda e la risposta relative alla password dell'utente di appartenenza nell'archivio dati di appartenenze. Equals Finalize Consente di determinare se l'oggetto Object specificato uguale all'oggetto Object corrente. (Ereditato da Object) Consente a un oggetto Object di provare a liberare risorse ed eseguire altre operazioni di pulitura prima che l'oggetto Object stesso venga recuperato dalla procedura di Garbage Collection. (Ereditato da Object) Funge da funzione hash per un determinato tipo. (Ereditato da Object) Sottoposto a overload. Ottiene la password dell'utente di appartenenza dall'archivio dati di appartenenze. Ottiene l'oggetto Type dell'istanza corrente. (Ereditato da Object) Consente di creare una copia dei riferimenti dell'oggetto Object corrente. (Ereditato da Object) Sottoposto a overload. Consente di impostare per un utente una nuova password generata automaticamente. Restituisce il nome dell'utente di appartenenza. (Esegue l'override di Object.ToString()). Annulla lo stato di blocco dell'utente in modo da consentire la convalida dell'utente di appartenenza.

GetHashCode GetPassword GetType MemberwiseClone ResetPassword ToString UnlockUser

PROPRIET
Nome Comment CreationDate Email IsApproved IsLockedOut IsOnline LastActivityDate LastLockoutDate LastLoginDate Descrizione Ottiene o imposta le informazioni specifiche dell'applicazione relative all'utente di appartenenza. Ottiene data e ora in cui l'utente stato aggiunto all'archivio dati di appartenenze. Ottiene o imposta l'indirizzo di posta elettronica dell'utente di appartenenza. Ottiene o imposta un valore che indica se possibile autenticare l'utente di appartenenza. Ottiene un valore che indica se l'utente di appartenenza stato bloccato e quindi non possibile effettuarne la convalida. Ottiene un valore che indica se l'utente correntemente in linea. Ottiene o imposta la data e l'ora pi recenti in cui l'utente di appartenenza stato autenticato o ha effettuato un accesso all'applicazione. Ottiene la data e l'ora dell'ultimo blocco dell'utente di appartenenza. Ottiene o imposta la data e l'ora dell'ultima autenticazione dell'utente.

LastPasswordChangedDate Ottiene data e ora in cui stato effettuato l'ultimo aggiornamento della password dell'utente di appartenenza. PasswordQuestion Ottiene la domanda per la password dell'utente di appartenenza.

sabato 6 luglio 2013 Pag. 95 / 151

SVILUPPARE UN SITO WEB ASP.NET

Nome ProviderName ProviderUserKey UserName

Descrizione Ottiene il nome del provider di appartenenze in cui sono memorizzate e da cui vengono recuperate le informazioni sugli utenti di appartenenza. Ottiene l'identificatore univoco dell'utente dall'origine dati di appartenenze dell'utente. Ottiene il nome di accesso dell'utente di appartenenza.

CLASSE MEMBERSHIPCREATESTATUS
Spazio dei nomi: System.Web.Security Assembly: System.Web (in System.Web.dll) L'enumerazione MembershipCreateStatus indica l'esito positivo o negativo di un tentativo di creazione di un nuovo utente. Se l'operazione di CreateUser non viene completata, l'enumerazione MembershipCreateStatus descrive la causa dell'esito negativo. Se si utilizza un overload del metodo CreateUser che non specifica un parametro di output di tipo MembershipCreateStatus, un tentativo senza risultati nel creare un nuovo utente genera un'eccezione MembershipCreateUserException con la propriet StatusCode impostata su uno dei valori dell'enumerazione MembershipCreateStatus.

MEMBRI
Nome membro Success InvalidUserName InvalidPassword InvalidQuestion InvalidAnswer InvalidEmail DuplicateUserName DuplicateEmail UserRejected InvalidProviderUserKey DuplicateProviderUserKey ProviderError Descrizione L'utente stato creato correttamente. Il nome utente non stato trovato nel database. La password non formattata correttamente. La domanda per la password non formattata correttamente. La risposta per la password non formattata correttamente. L'indirizzo di posta elettronica non formattato correttamente. Il nome utente gi presente nel database dell'applicazione. L'indirizzo di posta elettronica gi presente nel database dell'applicazione. L'utente non stato creato per un motivo definito dal provider. Il tipo o formato della chiave utente del provider non valido. La chiave utente del provider gi presente nel database dell'applicazione. Il provider ha restituito un errore non descritto da altri valori dell'enumerazione MembershipCreateStatus.

CLASSE MEMBERSHIPCREATEUSEREXCEPTION
Spazio dei nomi: System.Web.Security Assembly: System.Web (in System.Web.dll) Viene generata un'istanza della classe MembershipCreateUserException quando un'operazione CreateUser ha esito negativo. La propriet StatusCode indica la causa dell'eccezione in modo che sia possibile gestirla nel modo appropriato.

sabato 6 luglio 2013 Pag. 96 / 151

SVILUPPARE UN SITO WEB ASP.NET

CLASSE STATUSCODE
Spazio dei nomi: System.Web.Security Assembly: System.Web (in System.Web.dll) La propriet StatusCode consente di determinare la causa dell'eccezione MembershipCreateUserException e di rispondere in modo adeguato.

ESEMPI
Esempio Nell'esempio di codice riportato di seguito viene illustrata un'implementazione del metodo CreateUser di un provider di appartenenze. Tale metodo crea un oggetto MembershipUser restituito quando l'utente viene correttamente aggiunto all'archivio di dati. Public Overrides Function CreateUser(ByVal username As String, ByVal password As String, ByVal email As String, ByVal passwordQuestion As String, ByVal passwordAnswer As String, ByVal isApproved As Boolean, ByVal providerUserKey As Object, ByRef status As MembershipCreateStatus) As MembershipUser Dim Args As ValidatePasswordEventArgs = New ValidatePasswordEventArgs(username, password, True) OnValidatingPassword(Args) If Args.Cancel Then status = MembershipCreateStatus.InvalidPassword Return Nothing End If If RequiresUniqueEmail AndAlso GetUserNameByEmail(email) <> "" Then status = MembershipCreateStatus.DuplicateEmail Return Nothing End If Dim u As MembershipUser = GetUser(username, False) If u Is Nothing Then Dim createDate As DateTime = DateTime.Now If providerUserKey Is Nothing Then providerUserKey = Guid.NewGuid() Else If Not TypeOf providerUserKey Is Guid Then status = MembershipCreateStatus.InvalidProviderUserKey Return Nothing End If End If Dim conn As OdbcConnection = New OdbcConnection(ConnectionString) Dim cmd As OdbcCommand = New OdbcCommand("INSERT INTO Users (PKID, Username, Password, Email, PasswordQuestion, PasswordAnswer, IsApproved, Comment, CreationDate, LastPasswordChangedDate, LastActivityDate, ApplicationName, IsLockedOut, LastLockedOutDate, FailedPasswordAttemptCount, FailedPasswordAttemptWindowStart, FailedPasswordAnswerAttemptCount, FailedPasswordAnswerAttemptWindowStart) Values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", conn) cmd.Parameters.Add("@PKID", OdbcType.UniqueIdentifier).Value = providerUserKey cmd.Parameters.Add("@Username", OdbcType.VarChar, 255).Value = username cmd.Parameters.Add("@Password", OdbcType.VarChar, 255).Value = EncodePassword(password) cmd.Parameters.Add("@Email", OdbcType.VarChar, 128).Value = email cmd.Parameters.Add("@PasswordQuestion", OdbcType.VarChar, 255).Value = passwordQuestion cmd.Parameters.Add("@PasswordAnswer", OdbcType.VarChar, 255).Value = EncodePassword(passwordAnswer) cmd.Parameters.Add("@IsApproved", OdbcType.Bit).Value = isApproved cmd.Parameters.Add("@Comment", OdbcType.VarChar, 255).Value = "" cmd.Parameters.Add("@CreationDate", OdbcType.DateTime).Value = createDate cmd.Parameters.Add("@LastPasswordChangedDate", OdbcType.DateTime).Value = createDate cmd.Parameters.Add("@LastActivityDate", OdbcType.DateTime).Value = createDate cmd.Parameters.Add("@ApplicationName", OdbcType.VarChar, 255).Value = pApplicationName cmd.Parameters.Add("@IsLockedOut", OdbcType.Bit).Value = False cmd.Parameters.Add("@LastLockedOutDate", OdbcType.DateTime).Value = createDate cmd.Parameters.Add("@FailedPasswordAttemptCount", OdbcType.Int).Value = 0 cmd.Parameters.Add("@FailedPasswordAttemptWindowStart", OdbcType.DateTime).Value = createDate cmd.Parameters.Add("@FailedPasswordAnswerAttemptCount", OdbcType.Int).Value = 0
sabato 6 luglio 2013 Pag. 97 / 151

SVILUPPARE UN SITO WEB ASP.NET

cmd.Parameters.Add("@FailedPasswordAnswerAttemptWindowStart", OdbcType.DateTime).Value = createDate Try conn.Open() Dim recAdded As Integer = cmd.ExecuteNonQuery() If recAdded > 0 Then status = MembershipCreateStatus.Success Else status = MembershipCreateStatus.UserRejected End If Catch e As OdbcException ' Handle exception. status = MembershipCreateStatus.ProviderError Finally conn.Close() End Try Return GetUser(username, False) Else status = MembershipCreateStatus.DuplicateUserName End If Return Nothing End Function Esempio Nell'esempio di codice riportato di seguito viene illustrato come creare un nuovo utente per un'applicazione ASP.NET configurata per l'utilizzo dell'autenticazione basata su form e dell'appartenenza ASP.NET. <%@ Page Language="VB" %> <%@ Import Namespace="System.Web.Security" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> Public Sub CreateUser_OnClick(ByVal sender As Object, ByVal args As EventArgs) ' Create new user and retrieve create status result. Dim status As MembershipCreateStatus Dim passwordQuestion As String = "" Dim passwordAnswer As String = "" If Membership.RequiresQuestionAndAnswer Then passwordQuestion = PasswordQuestionTextbox.Text passwordAnswer = PasswordAnswerTextbox.Text End If Try Dim newUser As MembershipUser = Membership.CreateUser(UsernameTextbox.Text, PasswordTextbox.Text, EmailTextbox.Text, passwordQuestion, passwordAnswer, True, status) If newUser Is Nothing Then Msg.Text = GetErrorMessage(status) Else Response.Redirect("login.aspx") End If Catch Msg.Text = "An exception occurred creating the user." End Try End Sub Public Function GetErrorMessage(ByVal status As MembershipCreateStatus) As String Select Case status Case MembershipCreateStatus.DuplicateUserName Return "Username already exists. Please enter a different user name." Case MembershipCreateStatus.DuplicateEmail Return "A username for that e-mail address already exists. Please enter a different e-mail address." Case MembershipCreateStatus.InvalidPassword Return "The password provided is invalid. Please enter a valid password value." Case MembershipCreateStatus.InvalidEmail Return "The e-mail address provided is invalid. Please check the value and try again." Case MembershipCreateStatus.InvalidAnswer Return "The password retrieval answer provided is invalid. Please check the value and try again."
sabato 6 luglio 2013 Pag. 98 / 151

SVILUPPARE UN SITO WEB ASP.NET

Case MembershipCreateStatus.InvalidQuestion Return "The password retrieval question provided is invalid. Please check the value and try again." Case MembershipCreateStatus.InvalidUserName Return "The user name provided is invalid. Please check the value and try again." Case MembershipCreateStatus.ProviderError Return "The authentication provider returned an error. Please verify your entry and try again. If the problem persists, please contact your system administrator." Case MembershipCreateStatus.UserRejected Return "The user creation request has been canceled. Please verify your entry and try again. If the problem persists, please contact your system administrator." Case Else Return "An unknown error occurred. Please verify your entry and try again. If the problem persists, please contact your system administrator." End Select End Function </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Create User</title> </head> <body> <form id="form1" runat="server"> <h3>Create New User</h3> <asp:Label id="Msg" ForeColor="maroon" runat="server" /> <table cellpadding="3" border="0"> <tr> <td> Username: </td> <td> <asp:Textbox id="UsernameTextbox" runat="server" /> </td> <td> <asp:RequiredFieldValidator id="UsernameRequiredValidator" runat="server" ControlToValidate="UserNameTextbox" ForeColor="red" Display="Static" ErrorMessage="Required" /> </td> </tr> <tr> <td> Password: </td> <td> <asp:Textbox id="PasswordTextbox" runat="server" TextMode="Password" /> </td> <td> <asp:RequiredFieldValidator id="PasswordRequiredValidator" runat="server" ControlToValidate="PasswordTextbox" ForeColor="red" Display="Static" ErrorMessage="Required" /> </td> </tr> <tr> <td> Confirm Password: </td> <td> <asp:Textbox id="PasswordConfirmTextbox" runat="server" TextMode="Password" /> </td> <td> <asp:RequiredFieldValidator id="PasswordConfirmRequiredValidator" runat="server" ControlToValidate="PasswordConfirmTextbox" ForeColor="red" Display="Static" ErrorMessage="Required" /> <asp:CompareValidator id="PasswordConfirmCompareValidator" runat="server" ControlToValidate="PasswordConfirmTextbox" ForeColor="red" Display="Static" ControlToCompare="PasswordTextBox" ErrorMessage="Confirm password must match password." /> </td> </tr>
sabato 6 luglio 2013 Pag. 99 / 151

SVILUPPARE UN SITO WEB ASP.NET

<tr> <td> Email Address: </td> <td> <asp:Textbox id="EmailTextbox" runat="server" /> </td> <td> <asp:RequiredFieldValidator id="EmailRequiredValidator" runat="server" ControlToValidate="EmailTextbox" ForeColor="red" Display="Static" ErrorMessage="Required" /> </td> </tr> <% If Membership.RequiresQuestionAndAnswer Then %> <tr> <td> Password Question: </td> <td> <asp:Textbox id="PasswordQuestionTextbox" runat="server" /> </td> <td> <asp:RequiredFieldValidator id="PasswordQuestionRequiredValidator" runat="server" ControlToValidate="PasswordQuestionTextbox" ForeColor="red" Display="Static" ErrorMessage="Required" /> </td> </tr> <tr> <td> Password Answer: </td> <td> <asp:Textbox id="PasswordAnswerTextbox" runat="server" /> </td> <td> <asp:RequiredFieldValidator id="PasswordAnswerRequiredValidator" runat="server" ControlToValidate="PasswordAnswerTextbox" ForeColor="red" Display="Static" ErrorMessage="Required" /> </td> </tr> <% End If %> <tr> <td></td> <td><asp:Button id="CreateUserButton" Text="Create User" OnClick="CreateUser_OnClick" runat="server" /></td> </tr> </table> </form> </body> </html> Esempio Nell'esempio di codice riportato di seguito viene mostrato come restituire un elenco di utenti con un conteggio del numero di utenti correntemente in linea. <%@ Page Language="VB" %> <%@ Import Namespace="System.Web.Security" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script Dim Dim Dim Dim runat="server"> pageSize As Integer = 5 totalUsers As Integer totalPages As Integer currentPage As Integer = 1

Public Sub Page_Load() If Not IsPostBack Then GetUsers() End If End Sub Private Sub GetUsers() UsersOnlineLabel.Text = Membership.GetNumberOfUsersOnline().ToString() UserGrid.DataSource = Membership.GetAllUsers(currentPage - 1, pageSize, totalUsers)
sabato 6 luglio 2013 Pag. 100 / 151

SVILUPPARE UN SITO WEB ASP.NET

totalPages = ((totalUsers - 1) \ pageSize) + 1 ' Ensure that we do not navigate past the last page of users. If currentPage > totalPages Then currentPage = totalPages GetUsers() Return End If UserGrid.DataBind() CurrentPageLabel.Text = currentPage.ToString() TotalPagesLabel.Text = totalPages.ToString() If currentPage = totalPages Then NextButton.Visible = False Else NextButton.Visible = True End If If currentPage = 1 Then PreviousButton.Visible = False Else PreviousButton.Visible = True End If If totalUsers <= 0 Then NavigationPanel.Visible = False Else NavigationPanel.Visible = True End If End Sub Public Sub NextButton_OnClick(ByVal sender As Object, ByVal args As EventArgs) currentPage = Convert.ToInt32(CurrentPageLabel.Text) currentPage += 1 GetUsers() End Sub Public Sub PreviousButton_OnClick(ByVal sender As Object, ByVal args As EventArgs) currentPage = Convert.ToInt32(CurrentPageLabel.Text) currentPage -= 1 GetUsers() End Sub </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Sample: Find Users</title> </head> <body> <form id="form1" runat="server"> <h3>User List</h3> Number of Users Online: <asp:Label ID="UsersOnlineLabel" runat="Server" /><br /> <asp:Panel ID="NavigationPanel" Visible="false" runat="server"> <table border="0" cellpadding="3" cellspacing="3"> <tr> <td style="width: 100"> Page <asp:Label ID="CurrentPageLabel" runat="server" /> of <asp:Label ID="TotalPagesLabel" runat="server" /> </td> <td style="width: 60"> <asp:LinkButton ID="PreviousButton" Text="< Prev" OnClick="PreviousButton_OnClick" runat="server" /> </td> <td style="width: 60"> <asp:LinkButton ID="NextButton" Text="Next >" OnClick="NextButton_OnClick" runat="server" /> </td> </tr> </table> </asp:Panel>
sabato 6 luglio 2013 Pag. 101 / 151

SVILUPPARE UN SITO WEB ASP.NET

<asp:DataGrid ID="UserGrid" runat="server" CellPadding="2" CellSpacing="1" GridLines="Both"> <HeaderStyle BackColor="darkblue" ForeColor="white" /> </asp:DataGrid> </form> </body> </html>

CLASSE ROLES
Gestisce l'appartenenza degli utenti nei ruoli per il controllo delle autorizzazioni in un'applicazione ASP.NET. La gestione ruoli di ASP.NET consente di gestire l'autorizzazione per l'applicazione in base a gruppi di utenti, definiti ruoli. Assegnando gli utenti a ruoli specifici, possibile controllare l'accesso a funzionalit o parti diverse dell'applicazione Web in base al ruolo anzich, oppure oltre a, specificare l'autorizzazione in base al nome utente. Gli utenti possono appartenere a pi ruoli.

METODI
Nome AddUsersToRole AddUsersToRoles AddUserToRole Aggiunge utenti specifici al ruolo specificato. Aggiunge utenti specifici ai ruoli specificati. Aggiunge l'utente specificato al ruolo specificato. Il metodo AddUserToRole chiama il provider di ruoli predefinito per associare l'utente specificato al ruolo specificato nell'origine dati. Eccezione System.ArgumentNullException Condizione roleName riferimento null (Nothing in Visual Basic) -oppure- username riferimento null (Nothing in Visual Basic). roleName una stringa vuota o contiene una virgola (,) -oppure- username una stringa vuota o contiene una virgola (,). Le classi primarie derivate di ArgumentException sono ArgumentNullException e ArgumentOutOfRangeException. Queste classi derivate vanno utilizzate al posto di ArgumentException, tranne nei casi in cui nessuna di tali classi sia accettabile. Le eccezioni, ad esempio, devono essere generate da: ArgumentNullException ogni volta che nullNothingnullptrriferimento null (Nothing in Visual Basic) viene passato a un metodo che non lo accetta come argomento valido. ArgumentOutOfRangeException quando il valore di un argomento non compreso nell'intervallo dei valori accettabili Descrizione

System.ArgumentException

System.Configuration.Provider.ProviderException

La gestione ruoli non attivata. Questa classe di eccezione viene utilizzata anche dai provider per lanciare eccezioni quando si verificano errori interni al provider che non sono mappati in altre classi di eccezione predefinite.

AddUserToRoles CreateRole DeleteCookie

Aggiunge l'utente specificato ai ruoli specificati. Aggiunge un nuovo ruolo all'origine dati. Elimina il cookie in cui sono memorizzati i nomi di ruoli.

sabato 6 luglio 2013 Pag. 102 / 151

SVILUPPARE UN SITO WEB ASP.NET

Nome DeleteRole

Descrizione Il metodo DeleteRole(roleName) consente di rimuovere un nome di ruolo dall'origine dati. Il metodo DeleteRole chiama il metodo DeleteRole del provider di ruoli predefinito per rimuovere il ruolo specificato dall'origine dati. Se il ruolo identificato dal parametro roleName ha uno o pi membri, viene generata un'eccezione e il ruolo non viene eliminato. Ottiene un elenco di utenti appartenenti a un ruolo specificato in cui il nome utente contiene il nome utente specificato di cui verificare la corrispondenza. Ottiene un elenco di tutti i ruoli per l'applicazione. Sottoposto a overload. Ottiene un elenco di ruoli a cui appartiene un utente. Ottiene un elenco di utenti appartenenti al ruolo specificato. Sottoposto a overload. Ottiene un valore che indica se un utente appartiene al ruolo specificato. Rimuove l'utente specificato dal ruolo specificato. Rimuove l'utente specificato dai ruoli specificati. Rimuove gli utenti specificati dal ruolo specificato. Consente di rimuovere i nomi utente specificati dai ruoli specificati. Ottiene un valore che indica se il nome del ruolo specificato esiste gi nell'origine dati del ruolo.

FindUsersInRole

GetAllRoles GetRolesForUser GetUsersInRole IsUserInRole RemoveUserFromRole RemoveUserFromRoles RemoveUsersFromRole RemoveUsersFromRole s RoleExists

PROPRIET
Nome ApplicationName CacheRolesInCookie CookieName CookiePath CookieProtectionValue CookieRequireSSL CookieSlidingExpiration Descrizione Ottiene o imposta il nome dell'applicazione per cui archiviare e recuperare informazioni sui ruoli. Ottiene un valore che indica se i ruoli dell'utente corrente sono memorizzati in un cookie. Ottiene il nome del cookie in cui sono memorizzati i nomi dei ruoli. Ottiene il percorso del cookie dei nomi di ruoli memorizzati. Ottiene un valore che indica la modalit di protezione dei nomi di ruoli memorizzati in un cookie. Ottiene un valore che indica se il cookie dei nomi di ruoli richiede SSL per essere restituito al server. Indica se la data e l'ora di scadenza del cookie dei nomi di ruoli verranno reimpostate periodicamente. Ottiene il numero di minuti prima della scadenza del cookie. Ottiene un valore che indica se il cookie dei nomi di ruoli basato sulla sessione o persistente. Ottiene il valore del dominio del cookie dei nomi di ruoli. Ottiene o imposta un valore che indica se la gestione ruoli attivata per l'applicazione Web corrente. Ottiene il numero massimo di nomi di ruoli da memorizzare per un utente. Ottiene il provider di ruoli predefinito per l'applicazione. Ottiene un insieme dei provider di ruoli per l'applicazione ASP.NET.

CookieTimeout CreatePersistentCooki e Domain Enabled MaxCachedResults Provider Providers

sabato 6 luglio 2013 Pag. 103 / 151

SVILUPPARE UN SITO WEB ASP.NET

L I S T AT I
WEB.CONFIG <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <connectionStrings> <add name="AccessFileName" connectionString="~/mdb-database/ASPNetDB.mdb" providerName="System.Data.OleDb"/> </connectionStrings> <system.web> <authentication mode="Forms"> <forms loginUrl="Default.aspx" defaultUrl="Default.aspx" protection="Validation"/> </authentication> <membership defaultProvider="AccessMembershipProvider"> <providers> <clear/> <add name="AccessMembershipProvider" type="Samples.AccessProviders.AccessMembershipProvider, SampleAccessProviders" connectionStringName="AccessFileName" enablePasswordRetrieval="false" enablePasswordReset="false" requiresUniqueEmail="false" requiresQuestionAndAnswer="false" minRequiredPasswordLength="4" minRequiredNonalphanumericCharacters="0" applicationName="SampleSite" hashAlgorithmType="SHA1" passwordFormat="Hashed"/> </providers> </membership> <roleManager enabled="true" defaultProvider="AccessRoleProvider" cacheRolesInCookie="true" cookieName=".ASPXROLES" cookieTimeout="30" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="All"> <providers> <add name="AccessRoleProvider" type="Samples.AccessProviders.AccessRoleProvider, SampleAccessProviders" connectionStringName="AccessFileName" applicationName="SampleSite"/> </providers> </roleManager> <profile enabled="true" defaultProvider="AccessProfileProvider"> <providers> <add name="AccessProfileProvider" type="Samples.AccessProviders.AccessProfileProvider, SampleAccessProviders" connectionStringName="AccessFileName" applicationName="SampleSite" description="Stores and retrieves profile data from an ASP.NET_Access_Providers1 database."/> </providers> <properties> <add name="FriendlyName" type="string" allowAnonymous="true" serializeAs="String"/> <add name="Height" type="int" allowAnonymous="true" serializeAs="String"/> <add name="Weight" type="int" allowAnonymous="true" serializeAs="Xml"/> </properties> </profile> <anonymousIdentification enabled="true" cookieName=".ASPXANONYMOUS" cookieTimeout="100000" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="None" domain=""/> <webParts> <personalization defaultProvider="AccessPersonalizationProvider"> <providers> <add name="AccessPersonalizationProvider" type="Samples.AccessProviders.AccessPersonalizationProvider, SampleAccessProviders" connectionStringName="AccessFileName" applicationName="SampleSite"/> </providers> </personalization> </webParts> <!-<trust level="Medium"/> --> <compilation debug="true"> <assemblies> <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
sabato 6 luglio 2013 Pag. 104 / 151

SVILUPPARE UN SITO WEB ASP.NET

<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Data.Services.Client, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Data.Services.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Data.Entity, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> </assemblies> </compilation> <pages> <namespaces> <clear/> <add namespace="System"/> <add namespace="System.Collections"/> <add namespace="System.Collections.Specialized"/> <add namespace="System.Configuration"/> <add namespace="System.Text"/> <add namespace="System.Text.RegularExpressions"/> <add namespace="System.Web"/> <add namespace="System.Web.Caching"/> <add namespace="System.Web.SessionState"/> <add namespace="System.Web.Security"/> <add namespace="System.Web.Profile"/> <add namespace="System.Web.UI"/> <add namespace="System.Web.UI.WebControls"/> <add namespace="System.Web.UI.WebControls.WebParts"/> <add namespace="System.Web.UI.HtmlControls"/> <add namespace="System.Data.OleDb"/> </namespaces> </pages> <authorization> <allow users="*"/> <allow users="?"/> </authorization> <siteMap defaultProvider="Iscritti"> <providers> <add name="Admin" type="System.Web.XmlSiteMapProvider" siteMapFile="WebAdmin.sitemap"/> <add name="Iscritti" type="System.Web.XmlSiteMapProvider" siteMapFile="WebIscritti.sitemap"/> </providers> </siteMap> </system.web> </configuration> WEBADMIN.SITEMAP <?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="Default.aspx" title="Home page" description="Pagina iniziale, pubblica, del sito" > <siteMapNode url="~/admin/amministra.aspx" title="Home Amministratore" description="Area Amministratore: Home Page" > <siteMapNode url="~/admin/autorizzazioni.aspx" title="Registrazione Iscritti" description="Area Amministratore: Registrazione nuovi Iscritti" /> <siteMapNode url="~/admin/pannello.aspx" title="Gestione Iscritti" description="Area Amministratore: Gestione Iscritti esistenti" /> </siteMapNode> <siteMapNode url="~/private/iscritti_home.aspx" title="Home Iscritti" description="Area Iscritti: Home Page" > <siteMapNode url="~/private/Pag1.aspx" title="Pag.1 Iscritti" description="Area Iscritti: Pag.1" /> <siteMapNode url="~/private/Pag2.aspx" title="Pag.2 Iscritti" description="Area Iscritti: Pag.2" /> <siteMapNode url="~/private/Pag3.aspx" title="Pag.3 Iscritti" description="Area Iscritti: Pag.3" />
sabato 6 luglio 2013 Pag. 105 / 151

SVILUPPARE UN SITO WEB ASP.NET

<siteMapNode url="~/private/Pag4.aspx" title="Pag.4 Iscritti" description="Area Iscritti: Pag.4" /> <siteMapNode url="~/private/Pag5.aspx" title="Pag.5 Iscritti" description="Area Iscritti: Pag.5" /> <siteMapNode url="~/private/PagExcel.aspx" title="Doc. Excel Iscritti" description="Area Iscritti: Documenti Excel" /> <siteMapNode url="~/private/PagWord.aspx" title="Doc. Word Iscritti" description="Area Iscritti: Documenti Word" /> </siteMapNode> </siteMapNode> </siteMap> WEBISCRITTI.SITEMAP <?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="Default.aspx" title="Home page" description="Pagina iniziale, pubblica, del sito" > <siteMapNode url="~/private/iscritti_home.aspx" title="Home Iscritti" description="Area Iscritti: Home Page" > <siteMapNode url="~/private/Pag1.aspx" title="Pag.1 Iscritti" description="Area Iscritti: Pag.1" /> <siteMapNode url="~/private/Pag2.aspx" title="Pag.2 Iscritti" description="Area Iscritti: Pag.2" /> <siteMapNode url="~/private/Pag3.aspx" title="Pag.3 Iscritti" description="Area Iscritti: Pag.3" /> <siteMapNode url="~/private/Pag4.aspx" title="Pag.4 Iscritti" description="Area Iscritti: Pag.4" /> <siteMapNode url="~/private/Pag5.aspx" title="Pag.5 Iscritti" description="Area Iscritti: Pag.5" /> <siteMapNode url="~/private/PagExcel.aspx" title="Doc. Excel Iscritti" description="Area Iscritti: Documenti Excel" /> <siteMapNode url="~/private/PagWord.aspx" title="Doc. Word Iscritti" description="Area Iscritti: Documenti Word" /> </siteMapNode> </siteMapNode> </siteMap> FISSI.CSS /* elementi per la struttura */ body { font-family: Arial,sans-serif; color: #FF3333; line-height: 1.166; margin:0 1px 0 0; background-color: #F2F2F2; height: 100%; } #intestazione{ padding: 10px 0px 9px 0px; border-bottom: 1px solid #cccccc; width: 100%; border-color: #DDFFDD; } #int_sg{ margin: 0px 1px 15px 1px; background: #CCFFCC; border-top: 1px solid #000; border-bottom: 1px solid #000; border-top-width: 1px; border-bottom-width: 1px; border-top-color: #999999; border-bottom-color: #999999; font-family: Arial, Helvetica, sans-serif; color: #9797FF; padding-top: 3px; padding-bottom: 3px; } #colonna-sx{ border: 1px ridge #F2F2F2; float: left; width: 25%; font-size: 90%; font-family: Arial, Helvetica, sans-serif; color: #CC3300; } #principale{ float: left; width: 53%; background-color: #FEFEFE; font-family: Verdana; color: #0000C4; } #colonna-dx{ border: 5px double #666633; float: left; width: 19%; font-size: 90%; font-family: 'Times New Roman' , Times, serif; color: #990033; margin-right: -1px; margin-left: 10px; textalign: center; display: block; } #colonna-sx .box, #colonna-dx .box, #principale .box{ padding: 10px;
sabato 6 luglio 2013 Pag. 106 / 151

SVILUPPARE UN SITO WEB ASP.NET

} #corpocentrale{ padding: 10px; margin: 20px; clear: left; font-family: Verdana; font-size: 16px; color: #0000FF; display: block; } #footer{ clear: left; } /* Elementi per paragrafi */ h1{ font-family: Arial, Helvetica, sans-serif; font-size: 220%; color: #CA2B29; text-align: center; text-decoration: underline; padding: 0 0 0 0; margin: 0 0 0 0; } h2{ font-family: Helvetica, sans-serif; font-size: 160%; color: Blue; text-align: center; text-decoration: underline; margin: 0px; padding: 0px; } h4{ font-family: Helvetica, sans-serif; font-size: 110%; color: Green; text-align: center; font-style: italic; margin: 5px 5px 0px 15px; padding: 0px; } h5{ font-family: Helvetica, sans-serif; font-size: 90%; color: #B9B900; font-weight: lighter; text-align: right; margin: 0px; padding: 0px; letter-spacing: 1em; } .valid{ display: block; float: right; font-family: Verdana; font-size: xx-small; color: #0000FF; } /* Elementi formattazione caratteri */ .inclinarosso { font-style: oblique; color: Red; font-size: 98%; } .rossogrande { color: Red; font-size: 120%; } .inclina { font-style: oblique; color: Navy; font-size: 120%; } .fucsia { color: Fuchsia; } .azzurro{ color: #3366CC; } .centra{ text-align: center; } .legale{ color: #CE0000; font-size: 70%; font-family: "Courier New" , Courier, monospace; fontstyle: italic; padding-right: 20px; padding-left: 10px; margin-right: 20px; margin-left: 10px; } .grande{ color: #008000; font-family: Arial, Helvetica, sans-serif; font-size: 100%; } /* Elementi per grafica */ .imgsx{ border-style: solid; border-width: 1px; border-color: inherit; padding: 2px; margin: 1px 5px 9px 10px; display: block; float: left; height: 100px; }

sabato 6 luglio 2013 Pag. 107 / 151

SVILUPPARE UN SITO WEB ASP.NET

DEFAULT.ASPX
<%@ Page Language="VB" ResponseEncoding="iso-8859-15" AutoEventWireup="true" CodeFile="Default.aspx.vb" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> <meta name="description" content="" /> <meta name="keywords" content="" /> <link rel="stylesheet" href="fissi.css" type="text/css" /> <title>Sito di Prove</title> <style type="text/css"></style> </head> <body> <form id="pag_iniziale" runat="server"> <div id="intestazione"> <img class="imgsx" src="servizi/img/logo.jpg" alt="Logo" /> <h1>Intestazione SitoProve</h1> <h2>Sottointestazione</h2> <h4>Altre informazioni</h4> </div> <div id="int_sg"> <h5>Area Pubblica</h5> </div> <div id="colonna-sx"> <div class="box"> Siamo nell'Area Pubblica<br /> Area per i link etc. </div> </div> <div id="principale"> <div class="box"> Siamo nell'Area Pubblica<br /> Area principale per il testo </div> </div> <div id="colonna-dx"> <div class="box"> <p class="grande"> <span class="inclinarosso">Accesso alle Aree Riservate:</span><br /> <br /> <asp:Login ID="LogDefault" runat="server" OnLoggingIn="OnLoggingIn" MembershipProvider="AccessMembershipProvider" TitleText="Accesso" FailureText="Credenziali errate. Riprovare." RememberMeText="Memorizza dati per gli accessi successivi" BorderColor="#CCCC99" BorderStyle="Solid" BorderWidth="1px" FontNames="Verdana" Font-Size="9pt" TextLayout="TextOnTop" BackColor="#F7F7DE" RememberMeSet="True"> <TitleTextStyle BackColor="#6B696B" Font-Bold="True" ForeColor="#FFFFFF" /> <LayoutTemplate> <table border="0" cellpadding="1" cellspacing="0" style="border-collapse: collapse;" width="130px"> <tr> <td> <table border="0" cellpadding="0"> <tr> <td align="center" style="color: White; background-color: #6B696B; font-weight: bold;">Accesso</td> </tr> <tr> <td><asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserName">Nome utente:</asp:Label></td> </tr> <tr> <td> <asp:TextBox ID="UserName" runat="server" Width="100px"></asp:TextBox>
sabato 6 luglio 2013 Pag. 108 / 151

SVILUPPARE UN SITO WEB ASP.NET

<asp:RequiredFieldValidator ID="UserNameRequired" runat="server" ControlToValidate="UserName" ErrorMessage="Il nome utente obbligatorio." ToolTip="Il nome utente obbligatorio." ValidationGroup="LogDefault">* </asp:RequiredFieldValidator> </td> </tr> <tr> <td><asp:Label ID="PasswordLabel" runat="server" AssociatedControlID="Password">Password: </asp:Label></td> </tr> <tr> <td> <asp:TextBox ID="Password" runat="server" TextMode="Password" Width="100px"></asp:TextBox> <asp:RequiredFieldValidator ID="PasswordRequired" runat="server" ControlToValidate="Password" ErrorMessage="La password obbligatoria." ToolTip="La password obbligatoria." ValidationGroup="LogDefault">* </asp:RequiredFieldValidator> </td> </tr> <tr> <td><asp:CheckBox ID="RememberMe" runat="server" Text="Memorizza per gli accessi successivi" /></td> </tr> <tr> <td align="center" style="color: Red;"> <asp:Literal ID="FailureText" runat="server" EnableViewState="False"> </asp:Literal> </td> </tr> <tr> <td align="right"> <asp:Button ID="LoginButton" runat="server" CommandName="Login" Text="Accedi" ValidationGroup="LogDefault" /> </td> </tr> </table> </td> </tr> </table> </LayoutTemplate> </asp:Login> <br /><br />Se sei iscritto e non riesci ad accedere, scrivi al Wemaster dettagliando il problema:<br /><br /> <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="mailto:domenico@decerbo.it">Webmaster </asp:HyperLink> <br /> </p> </div> </div> <div id="footer"> <p class="legale">I documenti contenuti all'interno del sito sono riprodotti elettronicamente a titoloinformativo, riveste valore legale solo la documentazione originale depositata in sede</p> </div> <div class="valid">
sabato 6 luglio 2013 Pag. 109 / 151

SVILUPPARE UN SITO WEB ASP.NET

<asp:HyperLink ID="HyLkWebmaster" runat="server" NavigateUrl="mailto:domenico@decerbo.it">Domenico De Cerbo </asp:HyperLink>&nbsp &nbsp <asp:HyperLink ID="HyLkValidHTML" runat="server" NavigateUrl="http://validator.w3.org/check?uri=referer" ImageUrl="~/servizi/valid-xhtml10-blue.png" Height="31" Width="88" Text="Valid XHTML 1.0 Transitional"> </asp:HyperLink>&nbsp &nbsp <asp:HyperLink ID="HyLkValidCSS" runat="server" NavigateUrl="http://validator.w3.org/check?uri=referer" ImageUrl="~/servizi/valid-css2-blue.png" Height="31" Width="88" Text="Valid CSS 2.0"> </asp:HyperLink> </div> </form> </body> </html>

DEFAULT.ASPX.VB
Partial Class _Default Inherits System.Web.UI.Page Sub OnLoggingIn(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.LoginCancelEventArgs) If Roles.IsUserInRole(LogDefault.UserName, "Amministratori") Then LogDefault.DestinationPageUrl = "~/admin/amministra.aspx" e.Cancel = "false" ElseIf Roles.IsUserInRole(LogDefault.UserName, "Iscritti") Then LogDefault.DestinationPageUrl = "~/private/iscritti_home.aspx" e.Cancel = "false" End If End Sub End Class ADMIN\WEB.CONFIG <?xml version="1.0" encoding="utf-8"?> <configuration> <system.web> <authorization> <allow roles="Amministratori" /> <deny roles="Iscritti" /> <deny users="*" /> <deny users="?" /> </authorization> </system.web> </configuration> ADMIN\ADMIN.CSS /* elementi per la struttura */ body { font-family: Arial,sans-serif; color: #FF3333; line-height: 1.166; margin:0 1px 0 0; background-color: #F2F2F2; height: 100%; } #intestazione{ padding: 10px 0px 9px 0px; border-bottom: 1px solid #cccccc; width: 100%; border-color: #DDFFDD; } #int_admin{ background-position: #FE7070; margin: 0px 1px 15px 1px; background: #FE7070; border-top: 1px solid #000; border-bottom: 1px solid #000; border-top-width: 1px; border-bottomwidth: 1px; border-top-color: #999999; border-bottom-color: #999999; font-family: Arial, Helvetica, sans-serif; color: #9797FF; padding-top: 3px; padding-bottom: 3px; } #colonna-sx{ border: 1px ridge #F2F2F2; float: left; width: 215px; font-size: 90%; font-family: Arial, Helvetica, sans-serif; color: #CC3300;
sabato 6 luglio 2013 Pag. 110 / 151

SVILUPPARE UN SITO WEB ASP.NET

} #principale{ float: left; width: 410pt; background-color: #FEFEFE; font-family: Verdana; color: #0000C4; } #principale_largo{ border: thin solid #D4D4D4; padding: 10px; margin: 10px 5px 5px 5px; background-color: #FEFEFE; height: 100%; font-family: Verdana; color: #0000C4; } #secondario_largo{ border: thin solid #D4D4D4; padding: 10px; margin: 10px 5px 5px 5px; background-color: #FEFEFE; height: 100%; font-family: Verdana; color: #0000C4; display: block; } #inf-pannello{ float: left; width: 100%; margin: 5px 20px 20px 20px; font-family: Verdana; color: #0000C4; } #colonna-dx{ border: 5px double #666633; float: right; width: 160pt; font-size: 90%; font-family: 'Times New Roman' , Times, serif; color: #990033; margin-right: -1px; text-align: center; } #sup-comandi{ padding: 20px; margin: 5px 20px 20px 20px; border: 5px double #666633; width: 100%; fontsize: 90%; font-family: 'Times New Roman' , Times, serif; color: #990033; text-align: center; } #colonna-sx .box, #colonna-dx .box, #principale .box, #inf-pannello .box, #sup-comandi .box{ padding: 10px; } .boxcentra{ padding: 10px; text-align: center; } .riquadro{ border-style: inset; } .boxgrid{ float: left; display: block; width: 50%; } .boxdetails{ float: left; display: block; width: 50%; } #footer{ clear: left; } .boxbordato{ color: #FF0000; vertical-align: middle; text-align: center; border: medium double #008000; padding: 10px; margin: 5px; } /* Elementi per paragrafi */ h1{ font-family: Arial, Helvetica, sans-serif; font-size: 220%; color: #CA2B29; text-align: center; text-decoration: underline; padding: 0 0 0 0; margin: 0 0 0 0; } h2{ font-family: Helvetica, sans-serif; font-size: 160%; color: Blue; text-align: center; text-decoration: underline; margin: 0px; padding: 0px; } h4{ font-family: Helvetica, sans-serif; font-size: 110%; color: Green; text-align: center; font-style: italic; margin: 5px 5px 0px 15px; padding: 0px; } h5{
sabato 6 luglio 2013 Pag. 111 / 151

SVILUPPARE UN SITO WEB ASP.NET

font-family: Helvetica, sans-serif; font-size: 90%; color: #B9B900; font-weight: bold; text-align: center; margin: 0px; padding: 0px; letter-spacing: 3px; word-spacing: 5px; } .valid{ display: block; float: right; font-family: Verdana; font-size: xx-small; color: #0000FF; } .centra{ text-align: center; } /* Elementi formattazione caratteri */ .inclinarosso { font-style: oblique; color: Red; font-size: 98%; } .inclina { font-style: oblique; color: Navy; font-size: 120%; } .sottolinea{ text-decoration: underline; } .fucsia { color: Fuchsia; } .azzurro{ color: #3366CC; } .azzurrobold{ color: #3366CC; font-weight: bolder; } .giallo{ color: #FFFF00; } .legale{ color: #CE0000; font-size: 70%; font-family: "Courier New" , Courier, monospace; fontstyle: italic; padding-right: 10px; padding-left: 10px; margin-right: 10px; margin-left: 10px; } .grande{ color: #008000; font-family: Arial, Helvetica, sans-serif; font-size: 100%; } /* Elementi per grafica */ .imgsx{ border-style: solid; border-width: 1px; border-color: inherit; padding: 2px; margin: 1px 5px 9px 10px; display: block; float: left; height: 100px; } ADMIN\AMMINISTRA.ASPX <%@ Page Language="VB" ResponseEncoding="iso-8859-15" AutoEventWireup="true" Explicit="true" Trace="false" CodeFile="amministra.aspx.vb" Inherits="admin_amministra" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> <meta name="description" content="" /> <meta name="keywords" content="" /> <link rel="stylesheet" href="admin.css" type="text/css" /> <title>Sito di Prove</title> <style type="text/css"></style> </head> <body> <form id="home_admin" runat="server"> <div id="intestazione"> <img class="imgsx" src="../servizi/img/logo.jpg" alt="Logo" /> <h1>Intestazione SitoProve</h1> <h2>Sottointestazione</h2>
sabato 6 luglio 2013 Pag. 112 / 151

SVILUPPARE UN SITO WEB ASP.NET

<h4>Altre informazioni</h4> </div> <div id="int_admin"> <asp:LoginView ID="LoginView1" runat="server"> <RoleGroups> <asp:RoleGroup Roles="Amministratori"> <ContentTemplate> <h5><span class="giallo">Area Amministrazione - Utente collegato: <asp:LoginName ID="LoginName1" runat="server" /></span></h5> </ContentTemplate> </asp:RoleGroup> </RoleGroups> </asp:LoginView> <asp:LoginStatus runat="server" LogoutText=" L o g o u t " LogoutAction="Redirect" LogoutPageUrl="~/Default.aspx" BackColor="#E6E6E6" BorderColor="Silver" BorderStyle="Solid" BorderWidth="1px" FontNames="Verdana" Font-Size="12pt" ForeColor="#FF3300"> </asp:LoginStatus> </div> <div id="colonna-sx"> <asp:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1" ImageSet="XPFileExplorer" NodeIndent="15"> <ParentNodeStyle Font-Bold="False" /> <HoverNodeStyle Font-Underline="True" ForeColor="#6666AA" /> <SelectedNodeStyle BackColor="#B5B5B5" Font-Underline="False" HorizontalPadding="0px" VerticalPadding="0px" /> <NodeStyle Font-Names="Tahoma" Font-Size="8pt" ForeColor="Black" HorizontalPadding="2px" NodeSpacing="0px" VerticalPadding="2px" /> </asp:TreeView> <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" SiteMapProvider="Admin" /> <hr /><br /><br /><br /><hr /> <asp:ChangePassword ID="ChangePassword1" runat="server" BackColor="#F7F7DE" BorderColor="#CCCC99" BorderStyle="Solid" BorderWidth="1px" Font-Names="Verdana" Font-Size="10pt"> <TitleTextStyle BackColor="#6B696B" Font-Bold="True" ForeColor="#FFFFFF" /> <ChangePasswordTemplate> <table border="0" cellpadding="1" cellspacing="0" style="bordercollapse:collapse;"> <tr> <td> <table border="0" cellpadding="0"> <tr> <td align="center" colspan="2" style="color:White;backgroundcolor:#6B696B;font-weight:bold;">Cambia la tua Password</td> </tr> <tr> <td align="left"> <asp:Label ID="CurrentPasswordLabel" runat="server" AssociatedControlID="CurrentPassword">Password attuale:</asp:Label> </td> </tr> <tr> <td> <asp:TextBox ID="CurrentPassword" runat="server" TextMode="Password"></asp:TextBox> <asp:RequiredFieldValidator ID="CurrentPasswordRequired" runat="server" ControlToValidate="CurrentPassword" ErrorMessage="Immettere la Password corrente" ToolTip="La password obbligatoria." ValidationGroup="ChangePassword1">* </asp:RequiredFieldValidator> </td> </tr> <tr> <td align="left"> <asp:Label ID="NewPasswordLabel" runat="server" AssociatedControlID="NewPassword">Nuova password:</asp:Label> </td> </tr> <tr> <td>
sabato 6 luglio 2013 Pag. 113 / 151

SVILUPPARE UN SITO WEB ASP.NET

<asp:TextBox ID="NewPassword" runat="server" TextMode="Password"></asp:TextBox> <asp:RequiredFieldValidator ID="NewPasswordRequired" runat="server" ControlToValidate="NewPassword" ErrorMessage="Immettere la nuova Password" ToolTip="Il valore Nuova password obbligatorio." ValidationGroup="ChangePassword1">* </asp:RequiredFieldValidator> </td> </tr> <tr> <td align="left"> <asp:Label ID="ConfirmNewPasswordLabel" runat="server" AssociatedControlID="ConfirmNewPassword">Conferma la nuova Password:</asp:Label> </td> </tr> <tr> <td> <asp:TextBox ID="ConfirmNewPassword" runat="server" TextMode="Password"></asp:TextBox> <asp:RequiredFieldValidator ID="ConfirmNewPasswordRequired" runat="server" ControlToValidate="ConfirmNewPassword" ErrorMessage="Ripetere la nuova Password" ToolTip="Il valore Conferma password obbligatorio." ValidationGroup="ChangePassword1">* </asp:RequiredFieldValidator> </td> </tr> <tr> <td align="center" colspan="2"> <asp:CompareValidator ID="NewPasswordCompare" runat="server" ControlToCompare="NewPassword" ControlToValidate="ConfirmNewPassword" Display="Dynamic" ErrorMessage="La voce immessa in Conferma password deve corrispondere alla voce Nuova password." ValidationGroup="ChangePassword1"> </asp:CompareValidator> </td> </tr> <tr> <td align="center" colspan="2" style="color:Red;"> <asp:Literal ID="FailureText" runat="server" EnableViewState="False"></asp:Literal> </td> </tr> <tr> <td align="center"> <asp:Button ID="ChangePasswordPushButton" runat="server" CommandName="ChangePassword" Text="Cambia la Password" ValidationGroup="ChangePassword1" /> </td> </tr> <tr> <td align="center"> <asp:Button ID="CancelPushButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="Annulla" /> </td> </tr> </table> </td> </tr> </table> </ChangePasswordTemplate> </asp:ChangePassword> </div> <div id="principale"> <div class="box"><br /> <span class="sottolinea">Riepilogo dati iscritti</span><br /><br /> <asp:Literal ID="MessageOggi" runat="server" Text="Iscritti abilitati all'accesso alla data di oggi:" OnLoad="MessageOggi_Load"></asp:Literal><br /> <asp:Literal ID="IscrittiOggi" runat="server" Text="Totale iscritti nr." Mode="Encode" OnLoad="IscrOggiNr_Load"></asp:Literal>
sabato 6 luglio 2013 Pag. 114 / 151

SVILUPPARE UN SITO WEB ASP.NET

<asp:Literal ID="AbilitatiOggi" runat="server" Text=" - Totale abilitati nr." Mode="Encode" OnLoad="AbilOggiNr_Load"></asp:Literal><br /><br /> <asp:Literal ID="DataMessage" runat="server" Text="Iscritti abilitati all'accesso alla data di" Visible="False"></asp:Literal><br /> <asp:Literal ID="IscrCalendNr" runat="server" Text="Totale iscritti nr." Mode="Encode" Visible="False"></asp:Literal> <asp:Literal ID="AbilCalendNr" runat="server" Text=" - Totale abilitati nr." Mode="Encode" Visible="False"></asp:Literal><br /><br /> <asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="0" EnableTheming="False"> <asp:View ID="MostraAbilitati" runat="server"> <asp:AccessDataSource ID="AccessDS_HomeAdmin" runat="server" DataSourceMode="DataSet" DataFile="~/mdb-database/ASPNetDB.mdb" SelectCommand="SELECT UserId, NomeCompleto, CreateDate, IsApproved FROM [SpecIscritti] WHERE IsApproved = true ORDER BY NomeCompleto"></asp:AccessDataSource> <asp:GridView ID="GridView_HomeAdmin" runat="server" DataSourceID="AccessDS_HomeAdmin" EmptyDataText="nessun iscritto" AutoGenerateColumns="False" BackColor="#DEBA84" BorderColor="#DEBA84" BorderStyle="Solid" BorderWidth="1px" CellPadding="3" CellSpacing="5" HorizontalAlign="Center" AllowPaging="True" PagerSettingsMode="NumericFirstLast" AllowSorting="True"> <PagerSettings Mode="NumericFirstLast"></PagerSettings> <RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" HorizontalAlign="Center" /> <Columns> <asp:BoundField DataField="NomeCompleto" HeaderText="Iscritti" SortExpression="NomeCompleto" ItemStyle-HorizontalAlign="Left" ReadOnly="True" /> <asp:BoundField DataField="CreateDate" DataFormatString="{0:d}" HeaderText="Data di Iscrizione" SortExpression="CreateDate" ReadOnly="True" /> <asp:CheckBoxField DataField="IsApproved" HeaderText="Abil." SortExpression="IsApproved" ReadOnly="True" /> </Columns> <FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" /> <PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" /> <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" /> <HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" /> </asp:GridView> </asp:View> <asp:View ID="MostraTutti" runat="server"> <asp:AccessDataSource ID="DataSourceTutti" runat="server" DataSourceMode="DataSet" DataFile="~/mdb-database/ASPNetDB.mdb" SelectCommand="SELECT UserId, NomeCompleto, CreateDate, IsApproved FROM [SpecIscritti] ORDER BY NomeCompleto"></asp:AccessDataSource> <asp:GridView ID="GridView_Tutti" runat="server" DataSourceID="DataSourceTutti" EmptyDataText="nessun iscritto" AutoGenerateColumns="False" BackColor="#DEBA84" BorderColor="#DEBA84" BorderStyle="Solid" BorderWidth="1px" CellPadding="3" CellSpacing="5" HorizontalAlign="Center" AllowPaging="True" PagerSettingsMode="NumericFirstLast" AllowSorting="True"> <PagerSettings Mode="NumericFirstLast"></PagerSettings> <RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" HorizontalAlign="Center" /> <Columns> <asp:BoundField DataField="NomeCompleto" HeaderText="Iscritti" SortExpression="NomeCompleto" ItemStyle-HorizontalAlign="Left" ReadOnly="True" /> <asp:BoundField DataField="CreateDate" DataFormatString="{0:d}" HeaderText="Data di Iscrizione" SortExpression="CreateDate" ReadOnly="True" /> <asp:CheckBoxField DataField="IsApproved" HeaderText="Abil." SortExpression="IsApproved" ReadOnly="True" /> </Columns> <FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" /> <PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" /> <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" /> <HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" /> </asp:GridView> </asp:View> </asp:MultiView>
sabato 6 luglio 2013 Pag. 115 / 151

SVILUPPARE UN SITO WEB ASP.NET

<br /> </div> </div> <div id="colonna-dx"> <div class="box"> <asp:Calendar ID="CalendAdmin" runat="server" BackColor="#FFFFCC" BorderColor="#663300" BorderWidth="1px" DayNameFormat="Shortest" FontNames="Verdana" Font-Size="8pt" ForeColor="#663399" Height="200px" ShowGridLines="True" Width="220px" SelectionMode="Day"> <SelectedDayStyle BackColor="Lime" Font-Bold="True" ForeColor="#FF9900" /> <SelectorStyle BackColor="#FFCC66" /> <TodayDayStyle ForeColor="Red" Font-Bold="True" BorderStyle="Solid" BorderWidth="2" /> <OtherMonthDayStyle ForeColor="#CC9966" /> <NextPrevStyle Font-Size="9pt" ForeColor="#FFFFCC" /> <DayHeaderStyle BackColor="#FFCC66" Font-Bold="True" Height="1px" /> <TitleStyle BackColor="#990000" Font-Bold="True" Font-Size="9pt" ForeColor="#FFFFCC" /> </asp:Calendar><br /><br /><br /> <div class="boxbordato"> <asp:Label ID="Label1" runat="server" Text="Alterna la visualizzazione nella griglia:"></asp:Label><br /> <asp:Label ID="Label2" runat="server" Text="Tutti gli Iscritti / Solo abilitati all'accesso"></asp:Label><br /><br /> <span class="azzurrobold"> <asp:RadioButton ID="radioAbilitati" runat="server" AutoPostBack="true" GroupName="IndiceView" Text="Abilitati" OnCheckedChanged="radioAbilitati_Click" Checked="True" />&nbsp; <asp:RadioButton ID="radioTutti" runat="server" AutoPostBack="true" GroupName="IndiceView" Text="Tutti" OnCheckedChanged="radioAbilitati_Click" /><br /> </span> </div> </div> </div> <div id="footer"> <p class="valid">Webmaster: <asp:HyperLink ID="HyLkWebmaster" runat="server" NavigateUrl="mailto:domenico@decerbo.it">Domenico De Cerbo </asp:HyperLink> <asp:HyperLink ID="HyLkValidHTML" runat="server" NavigateUrl="http://validator.w3.org/check?uri=referer" ImageUrl="~/servizi/valid-xhtml10-blue.png" Height="31" Width="88" Text="Valid XHTML 1.0 Transitional"></asp:HyperLink>&nbsp &nbsp <asp:HyperLink ID="HyLkValidCSS" runat="server" NavigateUrl="http://validator.w3.org/check?uri=referer" ImageUrl="~/servizi/valid-css2-blue.png" Height="31" Width="88" Text="Valid CSS 2.0"></asp:HyperLink> </p> </div> </form> </body> </html> ADMIN\AMMINISTRA.ASPX.VB Partial Class admin_amministra Inherits System.Web.UI.Page Dim sqlIscritti As New System.Data.OleDb.OleDbCommand() Dim sqlAbilitati As New System.Data.OleDb.OleDbCommand() Dim sqlIscrittiCalend As New System.Data.OleDb.OleDbCommand() Dim sqlAbilitatiCalend As New System.Data.OleDb.OleDbCommand() Function CreaStringaConnessione() As String Dim Parte1 As String, Parte2 As String, Parte3 As String Parte1 = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " Parte2 = Server.MapPath("~\mdb-database\ASPNetDB.mdb") Parte3 = "; Persist Security Info = False" CreaStringaConnessione = Parte1 & Parte2 & Parte3 End Function 'inizio messaggio data odierna Sub MessageOggi_Load(ByVal sender As Object, ByVal e As EventArgs) Dim Oggi As DateTime MessageOggi.Text = ""
sabato 6 luglio 2013 Pag. 116 / 151

SVILUPPARE UN SITO WEB ASP.NET

Oggi = System.DateTime.Now() MessageOggi.Text = "Iscritti abilitati all'accesso alla data di " & Oggi.ToLongDateString() & ":" End Sub 'fine messaggio data odierna 'Inizio scrittura nr.iscritti Sub IscrOggiNr_Load(ByVal sender As Object, ByVal e As EventArgs) IscrittiOggi.Text = "Totale iscritti nr." IscrittiOggi.Text &= EstraeIscritti() ChiudeConnIscritti() End Sub Function EstraeIscritti() As String Dim NrIscritti As Int32, strIscrSQL As String Dim ConnIscritti As New System.Data.OleDb.OleDbConnection() strIscrSQL = "SELECT COUNT(*) FROM SpecIscritti" ConnIscritti.ConnectionString = CreaStringaConnessione() sqlIscritti.CommandText = strIscrSQL sqlIscritti.Connection = ConnIscritti ConnIscritti.Open() NrIscritti = Convert.ToInt32(sqlIscritti.ExecuteScalar()) EstraeIscritti = CStr(NrIscritti) End Function Sub ChiudeConnIscritti() sqlIscritti.Connection.Close() End Sub 'fine scrittura nr.iscritti 'inizio scrittura nr.abilitati Sub AbilOggiNr_Load(ByVal sender As Object, ByVal e As EventArgs) AbilitatiOggi.Text = " - Totale abilitati nr." AbilitatiOggi.Text &= EstraeAbilitati() ChiudeConnAbilitati() End Sub Function EstraeAbilitati() As String Dim NrAbilitati As Int32, strAbilSQL As String Dim ConnAbilitati As New System.Data.OleDb.OleDbConnection() strAbilSQL = "SELECT COUNT(UserId) FROM SpecIscritti WHERE IsApproved = true" ConnAbilitati.ConnectionString = CreaStringaConnessione() sqlAbilitati.CommandText = strAbilSQL sqlAbilitati.Connection = ConnAbilitati ConnAbilitati.Open() NrAbilitati = Convert.ToInt32(sqlAbilitati.ExecuteScalar()) EstraeAbilitati = CStr(NrAbilitati) End Function Sub ChiudeConnAbilitati() sqlAbilitati.Connection.Close() End Sub 'fine scrittura nr.abilitati 'inizio modifica vista su selezione radiobutton Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) If Not IsPostBack Then MultiView1.SetActiveView(MostraAbilitati) End If End Sub Protected Sub radioAbilitati_Click(ByVal sender As Object, ByVal e As System.EventArgs) If MultiView1.ActiveViewIndex = 0 Then MultiView1.SetActiveView(MostraTutti) ElseIf MultiView1.ActiveViewIndex = 1 Then MultiView1.SetActiveView(MostraAbilitati) End If End Sub Protected Enum IndiceView As Integer NotSet = -1 MostraAbilitati = 0 MostraTutti = 1 End Enum 'fine modifica vista su selezione radiobutton 'ROUTINE NON ATTIVE: inizio messaggio iscritti per data Sub Selection_Change(ByVal sender As Object, ByVal e As EventArgs)
sabato 6 luglio 2013 Pag. 117 / 151

SVILUPPARE UN SITO WEB ASP.NET

Dim day As DateTime For Each day In CalendAdmin.SelectedDates Select Case CDate(day) Case Is > System.DateTime.Now().Date DataMessage.Visible = "False" IscrCalendNr.Visible = "False" AbilCalendNr.Visible = "False" Case Is < System.DateTime.Now().Date DataMessage.Visible = "False" 'rendere visibili i tre controlli ed IscrCalendNr.Visible = "False" 'abilitara le righe successive dopo la AbilCalendNr.Visible = "False" 'soluzione dei problemi con le date 'DataMessage.Text = "Iscritti abilitati all'accesso alla data di " & day 'IscrCalendNr.Text = "Totale iscritti nr." & EstraeIscrittiCalend(DateSerial(day.Year, day.Month, day.Day)) 'ChiudeConnIscrittiCalend() 'AbilCalendNr.Text = " - Totale abilitati nr." & EstraeAbilitatiCalend(DateSerial(day.Year, day.Month, day.Day)) 'ChiudeConnAbilitatiCalend() Case Else DataMessage.Visible = "False" IscrCalendNr.Visible = "False" AbilCalendNr.Visible = "False" End Select Next End Sub Function EstraeIscrittiCalend(ByVal selezione As Date) As String Dim NrIscritti As Int32, strIscrSQL As String Dim ConnIscrittiCalend As New System.Data.OleDb.OleDbConnection() strIscrSQL = "SELECT COUNT(UserId) FROM SpecIscritti WHERE [CreateDate] <= #" & selezione & "#" ConnIscrittiCalend.ConnectionString = CreaStringaConnessione() sqlIscrittiCalend.CommandText = strIscrSQL sqlIscrittiCalend.Connection = ConnIscrittiCalend ConnIscrittiCalend.Open() NrIscritti = Convert.ToInt32(sqlIscrittiCalend.ExecuteScalar()) EstraeIscrittiCalend = CStr(NrIscritti) End Function Sub ChiudeConnIscrittiCalend() sqlIscrittiCalend.Connection.Close() End Sub Function EstraeAbilitatiCalend(ByVal selezione As Date) As String Dim NrAbilitati As Int32, strAbilSQL As String Dim ConnAbilitatiCalend As New System.Data.OleDb.OleDbConnection() strAbilSQL = "SELECT COUNT(UserId) FROM SpecIscritti WHERE IsApproved = true AND [CreateDate] <= #" & selezione & "#" ConnAbilitatiCalend.ConnectionString = CreaStringaConnessione() sqlAbilitatiCalend.CommandText = strAbilSQL sqlAbilitatiCalend.Connection = ConnAbilitatiCalend ConnAbilitatiCalend.Open() NrAbilitati = Convert.ToInt32(sqlAbilitatiCalend.ExecuteScalar()) EstraeAbilitatiCalend = CStr(NrAbilitati) End Function Sub ChiudeConnAbilitatiCalend() sqlAbilitatiCalend.Connection.Close() End Sub 'ROUTINE NON ATTIVE: fine messaggio iscritti per data End Class ADMIN\AUTORIZZAZIONI.ASPX <%@ Page Language="VB" AutoEventWireup="false" ResponseEncoding="iso-8859-15" Explicit="true" CodeFile="autorizzazioni.aspx.vb" Inherits="admin_login_admin" %> <%@ Register Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI.WebControls" TagPrefix="asp" %> <%@ Import Namespace="System.Web.Security" %> <%@ Import Namespace="System.Web.UI" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server">
sabato 6 luglio 2013 Pag. 118 / 151

SVILUPPARE UN SITO WEB ASP.NET

<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> <meta name="description" content="" /> <meta name="keywords" content="" /> <link rel="stylesheet" href="admin.css" type="text/css" /> <title>Sito di Prove</title> <style type="text/css"></style> </head> <body> <form id="Impostazioni_Default" runat="server"> <div id="intestazione"> <img class="imgsx" src="../servizi/img/logo.jpg" alt="Logo" /> <h1>Intestazione SitoProve</h1> <h2>Sottointestazione</h2> <h4>Altre informazioni</h4> </div> <div id="int_admin"> <asp:LoginView ID="LoginView1" runat="server"> <RoleGroups> <asp:RoleGroup Roles="Amministratori"> <ContentTemplate> <h5><span class="giallo">Area Amministrazione - Utente collegato: <asp:LoginName ID="LoginName1" runat="server" /></span></h5> </ContentTemplate> </asp:RoleGroup> </RoleGroups> </asp:LoginView> <asp:LoginStatus ID="LoginStatus1" runat="server" LogoutText=" L o g o u t " LogoutAction="Redirect" LogoutPageUrl="~/Default.aspx" BackColor="#E6E6E6" BorderColor="Silver" BorderStyle="Solid" BorderWidth="1px" Font-Names="Verdana" Font-Size="12pt" ForeColor="#FF3300"></asp:LoginStatus> </div> <div id="colonna-sx"> <asp:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1" ImageSet="XPFileExplorer" NodeIndent="15"> <ParentNodeStyle Font-Bold="False" /> <HoverNodeStyle Font-Underline="True" ForeColor="#6666AA" /> <SelectedNodeStyle BackColor="#B5B5B5" Font-Underline="False" HorizontalPadding="0px" VerticalPadding="0px" /> <NodeStyle Font-Names="Tahoma" Font-Size="8pt" ForeColor="Black" HorizontalPadding="2px" NodeSpacing="0px" VerticalPadding="2px" /> </asp:TreeView> <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" SiteMapProvider="Admin" /> </div> <div id="principale_largo"> In questa pagina possibile eseguire le seguenti operazioni: <ul> <li><a href="#creaIscritto">Registrare un nuovo Utente (Iscritto)</a></li> </ul> <ol> <li>&nbsp;&nbsp;Informazioni di base</li> <li>&nbsp;&nbsp;Attribuzione ad un Ruolo</li> <li>&nbsp;&nbsp;Informazioni aggiuntive</li> </ol> <ul> <li><a href="#creaRuolo">Creare un nuovo Ruolo o eliminare un Ruolo esistente</a></li> </ul><hr /> <h2><a id="creaIscritto">Registra un nuovo Iscritto</a></h2> <span class="inclinarosso">Per inserire un nuovo Iscritto seguire, nell'ordine, i passaggi che seguono: ad ogni passaggio occorre prima aver completato il passaggio precedente</span> <div class="boxcentra"> <h4>1 - Informazioni di base</h4> <div class="riquadro"> <table border="0" style="font-size: 100%; font-family: Verdana"> <tr> <td align="center" colspan="2" style="font-weight: bold; color: white; background-color: #5d7b9d">Registrazione</td> </tr> <tr> <td align="right"> <asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserNameTextBox">Account:</asp:Label>
sabato 6 luglio 2013 Pag. 119 / 151

SVILUPPARE UN SITO WEB ASP.NET

</td> <td> <asp:TextBox ID="UserNameTextBox" runat="server" OnLostFocus="UserName_LostFocus" Width="170px" AutoPostBack="True"></asp:TextBox> <asp:RequiredFieldValidator ID="UserNameRequired" runat="server" ControlToValidate="UserNameTextBox" ErrorMessage="- Il Nome di Account obbligatorio" ValidationGroup="Registrazione" ToolTip="Il Nome di Account obbligatorio.">* </asp:RequiredFieldValidator> </td> </tr> <tr> <td align="right"> <asp:Label ID="PasswordLabel" runat="server" AssociatedControlID="PasswordTextBox">Password:</asp:Label> </td> <td> <asp:TextBox ID="PasswordTextBox" runat="server" Width="170px" TextMode="Password"></asp:TextBox> <asp:RequiredFieldValidator ID="PasswordRequired" runat="server" ControlToValidate="PasswordTextBox" ErrorMessage="- La Password obbligatoria" ValidationGroup="Registrazione" ToolTip="La Password obbligatoria.">* </asp:RequiredFieldValidator> </td> </tr> <tr> <td align="right"> <asp:Label ID="ConfirmPasswordLabel" runat="server" AssociatedControlID="ConfirmPasswordTextBox">Conferma la Password:</asp:Label> </td> <td> <asp:TextBox ID="ConfirmPasswordTextBox" runat="server" Width="170px" TextMode="Password"></asp:TextBox> <asp:RequiredFieldValidator ID="ConfirmPasswordRequired" runat="server" ControlToValidate="PasswordTextBox" ErrorMessage="La ripetizione della Password obbligatoria" ValidationGroup="Registrazione" ToolTip="La conferma della Password obbligatoria.">* </asp:RequiredFieldValidator> </td> </tr> <tr> <td align="right"> <asp:Label ID="EmailLabel" runat="server" AssociatedControlID="EmailTextBox">E-mail:</asp:Label> </td> <td> <asp:TextBox ID="EmailTextBox" runat="server" Width="170px"></asp:TextBox> <asp:RequiredFieldValidator ID="EmailRequired" runat="server" ControlToValidate="EmailTextBox" ErrorMessage="- La E-mail richiesta. Se l'utente non possiede un indirizzo e-mail, inserirne uno fittizio utilizzando la sintassi: accountUtente@nomeSito.it" ValidationGroup="Registrazione" ToolTip="La E-mail richiesta.">* </asp:RequiredFieldValidator> </td> </tr> <tr> <td align="right"> <asp:Label ID="QuestionLabel" runat="server" AssociatedControlID="QuestionList">Domanda di sicurezza:</asp:Label> </td> <td> <asp:DropDownList ID="QuestionList" runat="server" Width="175px"> <asp:ListItem Selected="True" Text="" Value=""> (scegliere un'opzione) </asp:ListItem> <asp:ListItem Text="La tua prima auto" Value="La tua prima auto"> La tua prima auto </asp:ListItem> <asp:ListItem Text="Il cognome di tua madre" Value="Il cognome di tua madre"> Il cognome di tua madre </asp:ListItem>
sabato 6 luglio 2013 Pag. 120 / 151

SVILUPPARE UN SITO WEB ASP.NET

<asp:ListItem Text="Il tuo film preferito" Value="Il tuo film preferito"> Il tuo film preferito </asp:ListItem> <asp:ListItem Text="Il tuo cantante preferito" Value="Il tuo cantante preferito"> Il tuo cantante preferito </asp:ListItem> </asp:DropDownList> <asp:RequiredFieldValidator ID="QuestionRequired" runat="server" ControlToValidate="QuestionList" ErrorMessage="- La domanda di sicurezza obbligatoria (selezionare un elemento dalla lista)" ValidationGroup="Registrazione" ToolTip="La domanda di sicurezza obbligatoria.">* </asp:RequiredFieldValidator> </td> </tr> <tr> <td align="right"> <asp:Label ID="AnswerLabel" runat="server" AssociatedControlID="AnswerTextBox">Risposta alla domanda:</asp:Label> </td> <td> <asp:TextBox ID="AnswerTextBox" runat="server" Width="170px"></asp:TextBox> <asp:RequiredFieldValidator ID="AnswerRequired" runat="server" ControlToValidate="AnswerTextBox" ErrorMessage="- La risposta alla domanda obbligatoria" ValidationGroup="Registrazione" ToolTip="La risposta obbligatoria.">* </asp:RequiredFieldValidator> </td> </tr> <tr> <td align="right"> <asp:Label ID="IsApprovedLabel" runat="server" AssociatedControlID="IsApprovedButton">Abilitato?</asp:Label> </td> <td> <asp:RadioButtonList ID="IsApprovedButton" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow"> <asp:ListItem Value="True" Selected="True">Si</asp:ListItem> <asp:ListItem Value="False">No</asp:ListItem> </asp:RadioButtonList> <asp:RequiredFieldValidator ID="IsApprovedRequired" runat="server" ControlToValidate="IsApprovedButton" ErrorMessage="- L'indicazione dell'abilitazione richiesta" ValidationGroup="Registrazione" ToolTip="L'indicazione dell'abilitazione richiesta.">* </asp:RequiredFieldValidator> </td> </tr> <tr> <td align="center" colspan="2" style="color: red"> <asp:ValidationSummary ID="valSum_Base" DisplayMode="List" runat="server" ValidationGroup="Registrazione" HeaderText="Errori nell'immissione dei dati di base:" Font-Names="verdana" FontSize="10" /> </td> </tr> <tr> <td> </td> <td> <asp:Button ID="CreateUser" OnClick="CreateUser_OnClick" runat="server" Text="Registra l'Iscritto" /> </td> </tr> </table> <asp:RegularExpressionValidator ID="revUserNameTextBox" runat="server" ControlToValidate="UserNameTextBox" ValidationExpression="\w{6,15}" Display="None" ValidationGroup="Registrazione" ErrorMessage="- Il nome di Account deve avere tra 6 e 15 caratteri !" /> <asp:RegularExpressionValidator ID="revPasswordTextBox" runat="server" ControlToValidate="PasswordTextBox" ValidationExpression="^[A-Za-z09]{8,16}" Display="None" ValidationGroup="Registrazione" ErrorMessage="- La Password deve essere di lunghezza non inferiore a 8 e non superiore a 16 caratteri" />
sabato 6 luglio 2013 Pag. 121 / 151

SVILUPPARE UN SITO WEB ASP.NET

<asp:CompareValidator ID="NewPasswordCompare" runat="server" ControlToCompare="PasswordTextBox" ControlToValidate="ConfirmPasswordTextBox" Display="Dynamic" ValidationGroup="Registrazione" ErrorMessage="La voce immessa in Conferma la Password deve corrispondere alla voce Password." /> <asp:RegularExpressionValidator ID="revEmailTextBox" runat="server" ControlToValidate="EmailTextBox" ValidationExpression="^([\w\-\.]+)@((\[([09]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-Z]{2,4}))$" Display="None" ValidationGroup="Registrazione" ErrorMessage="E-Mail: immettere un formato e-mail valido" /> </div> <asp:Label ID="Msg" ForeColor="maroon" runat="server" Visible="false" /> <br /><br /><br /> <h4>2 - Attribuzione ad un Ruolo</h4> <div class="riquadro"> <table border="0" style="font-size: 100%; font-family: Verdana"> <tr> <td align="center" colspan="2" style="font-weight: bold; color: white; background-color: #5d7b9d">Ruolo per il nuovo Iscritto</td> </tr> <tr> <td align="right"> <asp:Label ID="ScegliUtente" runat="server" AssociatedControlID="UltimoUtente">Ultimo Iscritto registrato Account:</asp:Label> </td> <td> <asp:TextBox ID="UltimoUtente" Width="170px" runat="server"></asp:TextBox> </td> <td align="right"> <asp:Label ID="Label1" runat="server" AssociatedControlID="VediMaxID">User ID:</asp:Label> </td> <td> <asp:TextBox ID="VediMaxID" Width="70px" runat="server"></asp:TextBox> </td> </tr> <tr> <td align="right"> <asp:Label ID="ScegliRuolo" runat="server" AssociatedControlID="ListaRuoli">Scegli un Ruolo tra quelli della lista:</asp:Label> </td> <td> <asp:AccessDataSource ID="Access_RuoliEsistenti" runat="server" DataFile="~/mdb-database/ASPNetDB.mdb" SelectCommand="SELECT RoleName FROM [aspnet_Roles]"></asp:AccessDataSource> <asp:DropDownList ID="ListaRuoli" runat="server" DataSourceID="Access_RuoliEsistenti" DataTextField="RoleName" DataValueField="RoleName" Width="175px"> </asp:DropDownList> </td> </tr> <tr> <td><br /><br /> <asp:Button ID="AddUserButton" Text="Aggiungi l'Iscritto al ruolo selezionato" runat="server" OnClick="AddUserButton_Click" CausesValidation="False" /> </td> </tr> </table> <asp:Label ID="MsgRole" ForeColor="maroon" runat="server" Visible="true" /> </div><br /><br /><br /> <h4>3 - Informazioni aggiuntive</h4> <div class="riquadro"> <table border="0" style="font-size: 100%; font-family: Verdana"> <tr> <td align="center" colspan="2" style="font-weight: bold; color: white; background-color: #5d7b9d">Dati personali (ultimo registrato)</td> </tr> <tr> <td align="right">
sabato 6 luglio 2013 Pag. 122 / 151

SVILUPPARE UN SITO WEB ASP.NET

<asp:AccessDataSource ID="Personali_Source" runat="server" DataFile="~/mdb-database/ASPNetDB.mdb" SelectCommand="SELECT * FROM [DatiAggiunti] ORDER BY UserId DESC" DataSourceMode="DataSet" UpdateCommand="UPDATE [DatiAggiunti] SET [NomeCompleto]=@NomeCompleto, [nazione]=@nazione, [cap]=@cap, [citt]=@citt, [provincia]=@provincia, [indirizzo]=@indirizzo, [telcasa]=@telcasa, [telufficio]=@telufficio, [fax]=@fax, [cellulare]=@cellulare, [sitoweb]=@sitoweb WHERE [UserId]=@UserId"> <UpdateParameters> <asp:Parameter Name="NomeCompleto" Type="String" /> <asp:Parameter Name="nazione" Type="String" /> <asp:Parameter Name="cap" Type="String" /> <asp:Parameter Name="citt" Type="String" /> <asp:Parameter Name="provincia" Type="String" /> <asp:Parameter Name="indirizzo" Type="String" /> <asp:Parameter Name="telcasa" Type="String" /> <asp:Parameter Name="telufficio" Type="String" /> <asp:Parameter Name="fax" Type="String" /> <asp:Parameter Name="cellulare" Type="String" /> <asp:Parameter Name="sitoweb" Type="String" /> </UpdateParameters> </asp:AccessDataSource> <asp:DetailsView ID="Details_Nuovi" DataSourceID="Personali_Source" DataKeyNames="UserId" runat="server" AutoGenerateRows="False" EnableModelValidation="True" Height="5px" Width="400px" BackColor="LightGoldenrodYellow" BorderColor="#0000CC" BorderWidth="1px" CellPadding="2" ForeColor="#990000" BorderStyle="Double" Font-Names="Arial" Font-Overline="True" FontSize="11pt" CellSpacing="2" HorizontalAlign="Left" PagerSettingsVisible="False" RowStyle-Wrap="True" FooterStyle-Wrap="False" CommandRowStyle-VerticalAlign="Top" CaptionAlign="Right" PagerStyleWrap="False"> <FooterStyle BackColor="#FF8A6C" /> <CommandRowStyle BackColor="#FFFFE6" ForeColor="#006600" HorizontalAlign="Center" VerticalAlign="Top" Wrap="False" /> <Fields> <asp:CommandField ButtonType="Button" EditText="Vai a Modifica" ShowEditButton="True" ShowHeader="False" /> <asp:BoundField DataField="UserId" HeaderText="ID Nr." ReadOnly="True" ControlStyle-Width="170" ControlStyleBackColor="#FFFFE6" ItemStyleHorizontalAlign="Center"></asp:BoundField> <asp:TemplateField HeaderText="Cognome e Nome"> <ItemTemplate> <asp:Label ID="LblIscritto" runat="server" Text='<%# Bind("NomeCompleto") %>' Width="170"></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditIscritto" runat="server" Text='<%# Bind("NomeCompleto") %>' Width="172" Wrap="False"></asp:TextBox> <asp:RequiredFieldValidator ID="rfvEditIscritto" ControlToValidate="TxtEditIscritto" runat="server" ValidationGroup="Personalizzazioni" ErrorMessage="Iscritto: il campo non pu essere vuoto" Display="None" /> </EditItemTemplate> </asp:TemplateField> <asp:BoundField DataField="nazione" HeaderText="Nazione" /> <asp:TemplateField HeaderText="C.A.P."> <ItemTemplate> <asp:Label ID="LblCAP" runat="server" Text='<%# Bind("cap") %>' Width="170"></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditCAP" runat="server" Text='<%# Bind("cap") %>' Width="172" Wrap="False"></asp:TextBox> <asp:RegularExpressionValidator ID="revTxtEditCAP" runat="server" ControlToValidate="TxtEditCAP" ValidationExpression="\d{5}" Display="None" ValidationGroup="Personalizzazioni" ErrorMessage="C.A.P.: Pu essere lasciato vuoto, ma se inserito deve avere cinque caratteri numerici" /> </EditItemTemplate>
sabato 6 luglio 2013 Pag. 123 / 151

SVILUPPARE UN SITO WEB ASP.NET

</asp:TemplateField> <asp:BoundField DataField="citt" HeaderText="Citt" /> <asp:BoundField DataField="provincia" HeaderText="Provincia" /> <asp:BoundField DataField="indirizzo" HeaderText="Indirizzo" /> <asp:TemplateField HeaderText="Tel.Casa"> <ItemTemplate> <asp:Label ID="LblTelCasa" runat="server" Text='<%# Bind("telcasa") %>' Width="170"></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditTelCasa" runat="server" Text='<%# Bind("telcasa") %>' Width="172" Wrap="False"></asp:TextBox> <asp:RegularExpressionValidator ID="revTxtEditTelCasa" runat="server" ControlToValidate="TxtEditTelCasa" ValidationExpression="0{1}[0-9]{7,}" Display="None" ValidationGroup="Personalizzazioni" ErrorMessage="Tel. Casa: Pu essere lasciato vuoto, ma se inserito deve avere almeno otto caratteri numerici, di cui il primo deve essere 0 (zero)" /> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Tel.Ufficio"> <ItemTemplate> <asp:Label ID="LblTelUfficio" runat="server" Text='<%# Bind("telufficio") %>' Width="170"></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditTelUfficio" runat="server" Text='<%# Bind("telufficio") %>' Width="172" Wrap="False"></asp:TextBox> <asp:RegularExpressionValidator ID="revTxtEditTelUfficio" runat="server" ControlToValidate="TxtEditTelUfficio" ValidationExpression="0{1}[0-9]{5,}" Display="None" ValidationGroup="Personalizzazioni" ErrorMessage="Tel. Ufficio: Pu essere lasciato vuoto, ma se inserito deve avere almeno sei caratteri numerici, di cui il primo deve essere 0 (zero)" /> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Fax"> <ItemTemplate> <asp:Label ID="LblFax" runat="server" Text='<%# Bind("fax") %>' Width="170"></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditFax" runat="server" Text='<%# Bind("fax") %>' Width="172" Wrap="False"></asp:TextBox> <asp:RegularExpressionValidator ID="revTxtFax" runat="server" ControlToValidate="TxtEditFax" ValidationExpression="0{1}[0-9]{5,}" Display="None" ValidationGroup="Personalizzazioni" ErrorMessage="Fax: Pu essere lasciato vuoto, ma se inserito deve avere almeno sei caratteri numerici, di cui il primo deve essere 0 (zero)" /> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Cellulare"> <ItemTemplate> <asp:Label ID="LblCellulare" runat="server" Text='<%# Bind("cellulare") %>' Width="170"></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditCellulare" runat="server" Text='<%# Bind("cellulare") %>' Width="172" Wrap="False"></asp:TextBox> <asp:RegularExpressionValidator ID="revTxtEditCellulare" runat="server" ControlToValidate="TxtEditCellulare" ValidationExpression="3{1}[0-9]{7,}" Display="None" ValidationGroup="Personalizzazioni" ErrorMessage="Cellulare: Pu essere lasciato vuoto, ma se inserito deve avere almeno otto caratteri numerici, di cui il primo deve essere 3" /> </EditItemTemplate>
sabato 6 luglio 2013 Pag. 124 / 151

SVILUPPARE UN SITO WEB ASP.NET

</asp:TemplateField> <asp:TemplateField HeaderText="Sito Web"> <ItemTemplate> <asp:Label ID="LblSitoWeb" runat="server" Text='<%# Bind("sitoweb") %>' Width="170"></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditSitoWeb" runat="server" Text='<%# Bind("sitoweb") %>' Width="172"></asp:TextBox> <asp:RegularExpressionValidator ID="revTxtEditSitoWeb" runat="server" ControlToValidate="TxtEditSitoWeb" ValidationExpression="^http:\/\/(www\.)?[a-zA-Z0-9]{3,}\.[a-zA-Z]{2,}(\/)?$" ValidationGroup="Personalizzazioni" Display="None" ErrorMessage="Sito Web: Pu essere lasciato vuoto, ma se inserito deve iniziare con http:// o con http://www." /> </EditItemTemplate> </asp:TemplateField> </Fields> <HeaderStyle BackColor="Tan" Font-Bold="True" Width="400px" /> <RowStyle Width="400px" /> <AlternatingRowStyle BackColor="PaleGoldenrod" BorderStyle="Solid" BorderWidth="1px" VerticalAlign="Middle" Width="220px" Wrap="False" /> <EditRowStyle BackColor="#FFC6B7" ForeColor="#FF3300" BorderStyle="None" /> </asp:DetailsView> </td> </tr> <tr> <td align="center" colspan="2" style="color: red"> <asp:ValidationSummary ID="valSum_Personali" DisplayMode="List" runat="server" HeaderText="Errori nell'immissione dei dati personalizzati:" ShowSummary="True" Font-Names="verdana" FontSize="10" ValidationGroup="Personalizzazioni" /> </td> </tr> </table> </div><hr /><br /><br /><br /> <h2><a id="creaRuolo">Crea un nuovo Ruolo / Elimina un ruolo esistente</a></h2> <span class="inclinarosso">In questa sezione si possono aggiungere all'applicazione nuovi Ruoli o eliminare Ruoli esistenti se non sono associati ad Utenti</span><br /><br /> <div class="riquadro"> <table border="0" style="font-size: 100%; font-family: Verdana"> <tr> <td align="center" colspan="2" style="font-weight: bold; color: white; background-color: #5d7b9d"> <asp:GridView ID="GridRuoli" runat="server" AutoGenerateColumns="False" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" CellPadding="3" DataSourceID="Access_RuoliEsistenti" AllowSorting="True"> <RowStyle ForeColor="#000066" /> <Columns> <asp:CommandField ButtonType="Button" CausesValidation="False" InsertVisible="False" ShowCancelButton="False" ShowSelectButton="True" /> <asp:BoundField DataField="RoleName" HeaderText="Ruoli attuali" ReadOnly="True"> <HeaderStyle Font-Italic="True" Font-Size="9pt" FontUnderline="True" HorizontalAlign="Left" /> <ItemStyle Font-Bold="True" Font-Size="10pt" HorizontalAlign="Left" /> </asp:BoundField> </Columns> <FooterStyle BackColor="White" ForeColor="#000066" /> <PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" /> <SelectedRowStyle BackColor="#FF3300" Font-Bold="True" ForeColor="Yellow" /> <HeaderStyle BackColor="#D5F1FF" Font-Bold="True" ForeColor="#5B5BFF" /> </asp:GridView> </td>
sabato 6 luglio 2013 Pag. 125 / 151

SVILUPPARE UN SITO WEB ASP.NET

<td>&nbsp;&nbsp;Scrivi il nome del Ruolo da aggiungere:&nbsp;</td> <td> <asp:TextBox ID="RuoloNuovo" runat="server" Width="170" FontNames="Verdana" Font-Size="12pt" ForeColor="#993300"></asp:TextBox> </td> <td> <asp:Button ID="ConvalidaRuolo" runat="server" OnClick ="ConvalidaRuolo_Click" Text="Convalida" /> </td> </tr> <tr> <td> <asp:Button ID="Elimina" runat="server" Text="Elimina il Ruolo selezionato" OnClientClick="javascript:return confirm('Il Ruolo verr eliminato.\nConfermi?');" /> </td> <td colspan = "4"> <asp:Label ID="MsgNewRole" ForeColor="maroon" runat="server" Visible="true" /> <asp:Label ID="MsgElimina" ForeColor="maroon" runat="server" Visible="true" /> </td> </tr> </table> </div> <hr /> </div> </div> <div id="footer"> <p class="valid">Webmaster:<asp:HyperLink ID="HyLkWebmaster" runat="server" NavigateUrl="mailto:domenico@decerbo.it">Domenico De Cerbo </asp:HyperLink> <asp:HyperLink ID="HyLkValidHTML" runat="server" NavigateUrl="http://validator.w3.org/check?uri=referer" ImageUrl="~/servizi/valid-xhtml10-blue.png" Height="31" Width="88" Text="Valid XHTML 1.0 Transitional"></asp:HyperLink>&nbsp &nbsp <asp:HyperLink ID="HyLkValidCSS" runat="server" NavigateUrl="http://validator.w3.org/check?uri=referer" ImageUrl="~/servizi/valid-css2-blue.png" Height="31" Width="88" Text="Valid CSS 2.0"></asp:HyperLink> </p> </div> </form> </body> </html> ADMIN\AUTORIZZAZIONI.ASPX.VB Partial Class admin_login_admin Inherits System.Web.UI.Page Public NuovoUtente As String Dim sqlRuoli As New System.Data.OleDb.OleDbCommand() Dim sqlRegistra As New System.Data.OleDb.OleDbCommand() Public Sub Page_Load() MsgRole.Text = "" Msg.Text = "" MsgNewRole.Text = "" MsgElimina.Text = "" End Sub Function CreaStringaConnessione() As String Dim Parte1 As String, Parte2 As String, Parte3 As String Parte1 = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " Parte2 = Server.MapPath("~\mdb-database\ASPNetDB.mdb") Parte3 = "; Persist Security Info = False" CreaStringaConnessione = Parte1 & Parte2 & Parte3 End Function Protected Sub MostraMessaggio(ByVal Testo As String) Me.Msg.Visible = True Me.Msg.Text = Testo End Sub 'inizio creazione nuovo utente
sabato 6 luglio 2013 Pag. 126 / 151

SVILUPPARE UN SITO WEB ASP.NET

Sub UserName_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles UserNameTextBox.TextChanged If Me.CreateUser.Visible = False Then Me.CreateUser.Visible = True MostraMessaggio("") NuovoUtente = Me.UserNameTextBox.Text If CercaNome(NuovoUtente) > 0 Then MostraMessaggio("L'Account scelto gi esistente. Scegliere un nome diverso") Me.UserNameTextBox.Focus() Else Me.UltimoUtente.Text = NuovoUtente End If End Sub Public Sub CreateUser_OnClick(ByVal sender As Object, ByVal args As System.EventArgs) Handles CreateUser.Click Dim username As String Dim password As String Dim email As String Dim passwordQuestion As String Dim passwordAnswer As String Dim isApproved As Boolean Dim status As MembershipCreateStatus Dim returnValue As MembershipUser username = Me.UserNameTextBox.Text NuovoUtente = username password = Me.PasswordTextBox.Text email = Me.EmailTextBox.Text passwordQuestion = Me.QuestionList.Text passwordAnswer = Me.AnswerTextBox.Text isApproved = Me.IsApprovedButton.SelectedItem.Value returnValue = Membership.CreateUser(username, _ password, email, passwordQuestion, passwordAnswer, _ isApproved, status) Dim newUser As MembershipUser = Membership.CreateUser(username, password, _ email, passwordQuestion, passwordAnswer, isApproved, status) Me.Msg.Visible = True If CercaNome(Me.UserNameTextBox.Text) = 1 Then Dim NuovoID As Int32 = IDNuovoUtente(NuovoUtente) ID_aDatiAggiunti(NuovoID) Me.VediMaxID.Text = SelezionaMaxID() Aggiorna_Details() Msg.Text = "!! Il nuovo iscritto stato registrato !!" Me.CreateUser.Visible = False ElseIf CercaNome(Me.UserNameTextBox.Text) = 0 Then Msg.Text = "Attenzione: la procedura di registrazione non andata a buon fine" End If End Sub Public Function CercaNome(ByVal NomeImmesso As String) As Integer Dim returnValue As MembershipUserCollection returnValue = Membership.FindUsersByName(NomeImmesso) CercaNome = returnValue.Count End Function Function IDNuovoUtente(ByVal UtenteAggiunto As String) As Int32 Dim NrID As Int32, strSQL As String Dim sqlID As New System.Data.OleDb.OleDbCommand() Dim ConnID As New System.Data.OleDb.OleDbConnection() strSQL = "SELECT (UserId) FROM aspnet_Users WHERE UserName = '" & UtenteAggiunto & "'" ConnID.ConnectionString = CreaStringaConnessione() sqlID.CommandText = strSQL sqlID.Connection = ConnID ConnID.Open() NrID = Convert.ToInt32(sqlID.ExecuteScalar()) IDNuovoUtente = CStr(NrID) sqlID.Connection.Close() End Function Sub ID_aDatiAggiunti(ByVal IDDaAggiungere As Int32) Dim command As OleDbCommand Dim ConnID As New System.Data.OleDb.OleDbConnection() ConnID.ConnectionString = CreaStringaConnessione() ConnID.Open() command = New OleDbCommand("INSERT INTO DatiAggiunti (UserID) VALUES (" & IDDaAggiungere & ")", ConnID)
sabato 6 luglio 2013 Pag. 127 / 151

SVILUPPARE UN SITO WEB ASP.NET

If VerificaID(IDDaAggiungere) < 1 Then command.ExecuteScalar() End If ConnID.Close() End Sub Function VerificaID(ByVal ID As Int32) As Int32 Dim IDVerificando As Int32, strSQL_VerificaID As String Dim connVerificaID As New System.Data.OleDb.OleDbConnection() Dim SQL_VerificaID As New System.Data.OleDb.OleDbCommand() strSQL_VerificaID = "SELECT COUNT(*) FROM DatiAggiunti WHERE UserID = " & ID connVerificaID.ConnectionString = CreaStringaConnessione() SQL_VerificaID.CommandText = strSQL_VerificaID SQL_VerificaID.Connection = connVerificaID connVerificaID.Open() IDVerificando = Convert.ToInt32(SQL_VerificaID.ExecuteScalar()) VerificaID = CStr(IDVerificando) connVerificaID.Close() End Function Function SelezionaMaxID() As Int32 Dim strSQL As String Dim sqlID As New System.Data.OleDb.OleDbCommand() Dim ConnID As New System.Data.OleDb.OleDbConnection() strSQL = "SELECT * FROM MaxID" ConnID.ConnectionString = CreaStringaConnessione() sqlID.CommandText = strSQL sqlID.Connection = ConnID ConnID.Open() SelezionaMaxID = Convert.ToInt32(sqlID.ExecuteScalar()) sqlID.Connection.Close() End Function 'Fine creazione nuovo utente 'Inizio attribuisci a Ruolo Protected Sub AddUserButton_Click(ByVal sender As Object, ByVal args As System.EventArgs) Handles AddUserButton.Click Dim RuoloDaAssegnare As String Dim UtenteCreato As String = Me.UltimoUtente.Text If ListaRuoli.SelectedItem Is Nothing Then MsgRole.Text = "Selezionare un Ruolo" Exit Sub Else RuoloDaAssegnare = ListaRuoli.SelectedItem.Value End If Try Roles.AddUserToRole(UtenteCreato, RuoloDaAssegnare) MsgRole.Text = "L'Iscritto < " & UtenteCreato & " > stato assegnato al Ruolo < " & RuoloDaAssegnare & " > !" Catch e As HttpException MsgRole.Text = "!! " & e.Message & " !!" Catch prv As System.Configuration.Provider.ProviderException 'problema da risolvere: se si attiva un messaggio, 'appare anche quando il ruolo viene assegnato correttamente End Try End Sub 'Fine attribuisci a Ruolo 'Inizio informazioni aggiuntive Sub Aggiorna_Details() Me.Details_Nuovi.DataBind() End Sub 'Fine informazioni aggiuntive 'Inizio crea o elimina ruolo Protected Sub ConvalidaRuolo_Click(ByVal sender As Object, ByVal arg As System.EventArgs) Handles ConvalidaRuolo.Click Dim createRole As String = RuoloNuovo.Text MsgNewRole.Text = "" MsgElimina.Text = "" Try Roles.CreateRole(createRole) MsgNewRole.Text = "Il ruolo < " & RuoloNuovo.Text & "> stato aggiunto." & Chr(13) & "E' possibile aggiungere altri Ruoli" GridRuoli.DataBind() ListaRuoli.DataBind()
sabato 6 luglio 2013 Pag. 128 / 151

SVILUPPARE UN SITO WEB ASP.NET

Catch e As SystemException MsgNewRole.Text = "Non stato possibile creare il nuovo ruolo < " & RuoloNuovo.Text & " >." Catch prv As System.Configuration.Provider.ProviderException 'problema da risolvere: se si attiva il messaggio sottostante, 'appare anche quando il ruolo non esisteva e viene creato 'MsgNewRole.Text = "Il ruolo < " & RuoloNuovo.Text & " > gi esiste. Specificare un nuovo nome" End Try End Sub Protected Sub Elimina_Click(ByVal sender As Object, ByVal arg As System.EventArgs) Handles Elimina.Click Dim RigaSelezionata As GridViewRow = GridRuoli.SelectedRow Dim RuoloDaEliminare As String = RigaSelezionata.Cells(1).Text RuoloNuovo.Text = "" MsgNewRole.Text = "" MsgElimina.Text = "" Try Roles.DeleteRole(RuoloDaEliminare) MsgElimina.Text = "Il Ruolo < " & RuoloDaEliminare & " > stato eliminato" GridRuoli.DataBind() ListaRuoli.DataBind() Catch e As SystemException MsgElimina.Text = "Il Ruolo < " & RuoloDaEliminare & " > non stato eliminato" Catch prv As System.Configuration.Provider.ProviderException MsgElimina.Text = "Il Ruolo < " & RuoloDaEliminare & " > non stato eliminato perch associato ad utenti." & Chr(13) & "Eliminare prima le associazioni, in Gestione Iscritti, e poi il ruolo." End Try End Sub Protected Sub GridRuoli_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridRuoli.SelectedIndexChanged MsgRole.Text = "" Msg.Text = "" MsgNewRole.Text = "" MsgElimina.Text = "" End Sub 'Fine crea o elimina ruolo End Class ADMIN\PANNELLO.ASPX <%@ Page Language="VB" AutoEventWireup="false" ResponseEncoding="iso-8859-15" Explicit="true" CodeFile="pannello.aspx.vb" Inherits="admin_pannello" %> <%@ Register Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI.WebControls" TagPrefix="asp" %> <%@ Import Namespace="System.Web.Security" %> <%@ Import Namespace="System.Web.UI" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> <meta name="description" content="" /> <meta name="keywords" content="" /> <link rel="stylesheet" href="admin.css" type="text/css" /> <title>Sito di Prove</title> <style type="text/css"></style> </head> <body> <form id="pannello_admin" runat="server"> <div id="intestazione"> <img class="imgsx" src="../servizi/img/logo.jpg" alt="Logo" /> <h1>Intestazione SitoProve</h1> <h2>Sottointestazione</h2> <h4>Altre informazioni</h4> </div> <div id="int_admin"> <asp:LoginView ID="LoginView1" runat="server"> <RoleGroups> <asp:RoleGroup Roles="Amministratori">
sabato 6 luglio 2013 Pag. 129 / 151

SVILUPPARE UN SITO WEB ASP.NET

<ContentTemplate> <h5><span class="giallo">Area Amministrazione - Utente collegato:<asp:LoginName ID="LoginName1" runat="server" /></span></h5> </ContentTemplate> </asp:RoleGroup> </RoleGroups> </asp:LoginView> <asp:LoginStatus ID="LoginStatus1" runat="server" LogoutText=" L o g o u t " LogoutAction="Redirect" LogoutPageUrl="~/Default.aspx" BackColor="#E6E6E6" BorderColor="Silver" BorderStyle="Solid" BorderWidth="1px" Font-Names="Verdana" Font-Size="12pt" ForeColor="#FF3300"> </asp:LoginStatus> </div> <div id="colonna-sx"> <asp:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1" ImageSet="XPFileExplorer" NodeIndent="15"> <ParentNodeStyle Font-Bold="False" /> <HoverNodeStyle Font-Underline="True" ForeColor="#6666AA" /> <SelectedNodeStyle BackColor="#B5B5B5" Font-Underline="False" HorizontalPadding="0px" VerticalPadding="0px" /> <NodeStyle Font-Names="Tahoma" Font-Size="8pt" ForeColor="Black" HorizontalPadding="2px" NodeSpacing="0px" VerticalPadding="2px" /> </asp:TreeView> <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" SiteMapProvider="Admin" /> </div> <div id="principale_largo"> In questa pagina possibile eseguire le seguenti operazioni: <ul> <li><a href="#modificaIscritto">Modificare i dati di un Utente (Iscritto)</a></li> </ul> <ul> <li><a href="#eliminaIscritto">Eliminare un Utente</a></li> </ul> <ul> <li><a href="#modificaRuoli">Modificare il Ruolo di un Utente</a></li> </ul><hr /> <h2><a id="modificaIscritto">Modifica i dati degli Iscritti</a></h2> <div class="box"><br /> <div class="boxgrid"> <asp:Label ID="Label1" runat="server" Text="Nel Pannello sottostante possibile selezionare"></asp:Label><br /> <asp:Label ID="Label2" runat="server" Text="gli iscritti per i quali occorre modificare"></asp:Label><br /> <asp:Label ID="Label3" runat="server" Text="i contenuti dei campi del database:"></asp:Label><br /><br /><br /><br /><br /> <asp:AccessDataSource ID="Grid_Source" runat="server" DataFile="~/mdbdatabase/ASPNetDB.mdb" SelectCommand="SELECT * FROM [SpecIscritti]" DataSourceMode="DataSet"></asp:AccessDataSource> <asp:GridView ID="GridView_Pannello" DataSourceID="Grid_Source" DataKeyNames="UserId" runat="server" AutoGenerateColumns="False" AllowSorting="True" AllowPaging="True" OnSelectedIndexChanged="GridView_Pannello_SelectedIndexChanged" OnPageIndexChanged="GridView_Pannello_PageIndexChanged" OnSorted="GridView_Pannello_Sorted" EmptyDataText="nessun iscritto" BackColor="#DEBA84" BorderColor="#EDD9BA" BorderStyle="Solid" BorderWidth="1px" CellPadding="3" CellSpacing="2" Font-Names="SansSerif" Font-Size="9pt"> <RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" /> <Columns> <asp:CommandField ShowSelectButton="True" ButtonType="Button" DeleteText="" EditText="" InsertText="" NewText="" SelectText="Selez." UpdateText="" /> <asp:BoundField DataField="UserId" HeaderText="Nr." ReadOnly="True" SortExpression="UserId" /> <asp:BoundField DataField="NomeCompleto" HeaderText="Iscritto" ReadOnly="True" SortExpression="NomeCompleto" /> <asp:CheckBoxField DataField="IsApproved" HeaderText="Abilitato?" SortExpression="IsApproved"> <ItemStyle HorizontalAlign="Center" /> </asp:CheckBoxField> <asp:BoundField DataField="UserName" HeaderText="Account" ReadOnly="False" SortExpression="UserName" />
sabato 6 luglio 2013 Pag. 130 / 151

SVILUPPARE UN SITO WEB ASP.NET

<asp:BoundField DataField="CreateDate" DataFormatString="{0:d}" HeaderText="Data di iscrizione" ReadOnly="True" SortExpression="CreateDate" /> </Columns> <FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" /> <PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" /> <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" /> <HeaderStyle BackColor="#D88D69" Font-Bold="True" ForeColor="Yellow" /> <EditRowStyle ForeColor="#0066FF" HorizontalAlign="Left" VerticalAlign="Middle" /> </asp:GridView><br /><br /> </div> <div class="boxdetails"> <asp:Label ID="LabelSelezionato" runat="server" Text="Scheda Iscritto" Visible="False"></asp:Label><br /> <asp:ValidationSummary ID="SommarioErrori" runat="server" HeaderText="Errori nell'immissione dei dati (annulla e ripeti l'operazione immettendo dati corretti):" ShowSummary="True" Width="395px" BorderStyle="Solid" BorderWidth="2" BorderColor="#0066FF" BackColor="#FFFFB7" Font-Size="10pt" /> <asp:AccessDataSource ID="Details_Source" runat="server" DataSourceMode="DataSet" DataFile="~/mdb-database/ASPNetDB.mdb" SelectCommand="SELECT * FROM [SpecIscritti] WHERE [UserId] = @UserId" UpdateCommand="UPDATE [SpecIscritti] SET [UserName]=@UserName, [NomeCompleto]=@NomeCompleto, [RoleName]=@RoleName, [IsApproved]=@IsApproved, [CreateDate]=@CreateDate, [LastLoginDate]=@LastLoginDate, [PasswordQuestion]=@PasswordQuestion, [PasswordAnswer]=@PasswordAnswer, [Email]=@Email, [nazione]=@nazione, [cap]=@cap, [citt]=@citt, [provincia]=@provincia, [indirizzo]=@indirizzo, [telcasa]=@telcasa, [telufficio]=@telufficio, [fax]=@fax, [cellulare]=@cellulare, [sitoweb]=@sitoweb WHERE [UserId]=@UserId"> <SelectParameters> <asp:ControlParameter ControlID="GridView_Pannello" Name="UserId" PropertyName="SelectedValue" Type="Int32" /> </SelectParameters> <UpdateParameters> <asp:Parameter Name="UserName" Type="String" /> <asp:Parameter Name="NomeCompleto" Type="String" /> <asp:Parameter Name="RoleName" Type="String" /> <asp:Parameter Name="IsApproved" Type="Boolean" /> <asp:Parameter Name="CreateDate" Type="DateTime" /> <asp:Parameter Name="LastLoginDate" Type="DateTime" /> <asp:Parameter Name="PasswordQuestion" Type="String" /> <asp:Parameter Name="PasswordAnswer" Type="String" /> <asp:Parameter Name="Email" Type="String" /> <asp:Parameter Name="nazione" Type="String" /> <asp:Parameter Name="cap" Type="String" /> <asp:Parameter Name="citt" Type="String" /> <asp:Parameter Name="provincia" Type="String" /> <asp:Parameter Name="indirizzo" Type="String" /> <asp:Parameter Name="telcasa" Type="String" /> <asp:Parameter Name="telufficio" Type="String" /> <asp:Parameter Name="fax" Type="String" /> <asp:Parameter Name="cellulare" Type="String" /> <asp:Parameter Name="sitoweb" Type="String" /> </UpdateParameters> </asp:AccessDataSource><br /> <asp:DetailsView ID="Details_Pannello" DataSourceID="Details_Source" DataKeyNames="UserId" runat="server" OnModeChanged="Details_Pannello_ModeChanged" OnItemUpdated="Details_Pannello_ItemUpdated" AutoGenerateRows="False" EnableModelValidation="True" Height="5px" Width="400px" BackColor="LightGoldenrodYellow" BorderColor="#0000CC" BorderWidth="1px" CellPadding="2" ForeColor="#990000" BorderStyle="Double" Font-Names="Arial" Font-Overline="True" Font-Size="11pt" CellSpacing="2" HorizontalAlign="Left" PagerSettings-Position="Top" RowStyle-Wrap="True" FooterStyle-Wrap="False" CommandRowStyle-VerticalAlign="Top"> <PagerSettings PageButtonCount="5" /> <FooterStyle BackColor="Tan" /> <CommandRowStyle BackColor="Yellow" ForeColor="#006600" HorizontalAlign="Center" VerticalAlign="Top" Wrap="False" /> <RowStyle Width="220px" /> <PagerStyle BackColor="PaleGoldenrod" ForeColor="DarkSlateBlue" HorizontalAlign="Center" />
sabato 6 luglio 2013 Pag. 131 / 151

SVILUPPARE UN SITO WEB ASP.NET

<Fields> <asp:CommandField ButtonType="Button" EditText="Modifica l'Iscritto corrente" ShowEditButton="True" ShowHeader="False" /> <asp:BoundField DataField="UserId" HeaderText="ID Nr." ReadOnly="True" ControlStyle-Width="150"> <ControlStyle Width="150px"></ControlStyle> </asp:BoundField> <asp:TemplateField HeaderText="Account"> <ItemTemplate> <asp:Label ID="LblAccount" runat="server" Text='<%# Bind("UserName") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditAccount" runat="server" Text='<%# Bind("UserName") %>'></asp:TextBox> <asp:RequiredFieldValidator ID="rfvEditAccount" ControlToValidate="TxtEditAccount" runat="server" ErrorMessage="Account: il campo non pu essere vuoto" Display="None" /> <asp:RegularExpressionValidator ID="revTxtEditAccount" runat="server" ControlToValidate="TxtEditAccount" ValidationExpression="\w{6,12}" Display="None" ErrorMessage="Account: deve essere tra 6 e 12 caratteri (solo alfabetici)" /> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Cognome e Nome"> <ItemTemplate> <asp:Label ID="LblIscritto" runat="server" Text='<%# Bind("NomeCompleto") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditIscritto" runat="server" Text='<%# Bind("NomeCompleto") %>'></asp:TextBox> <asp:RequiredFieldValidator ID="rfvEditIscritto" ControlToValidate="TxtEditIscritto" runat="server" ErrorMessage="Iscritto: il campo non pu essere vuoto" Display="None" /> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Ruolo"> <ItemTemplate> <asp:Label ID="LblRuolo" runat="server" Text='<%# Bind("RoleName") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditRuolo" runat="server" ReadOnly="True" Text='<%# Bind("RoleName") %>'></asp:TextBox> </EditItemTemplate> </asp:TemplateField> <asp:CheckBoxField DataField="IsApproved" HeaderText="Abilitato?" ReadOnly="False" /> <asp:TemplateField HeaderText="Data di Iscrizione"> <ItemTemplate> <asp:Label ID="LblIscrizione" runat="server" Text='<%# Bind("CreateDate") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditIscrizione" runat="server" Text='<%# Bind("CreateDate") %>' ReadOnly="True"></asp:TextBox> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Ultimo Accesso"> <ItemTemplate> <asp:Label ID="LblUltimoAccesso" runat="server" Text='<%# Bind("LastLoginDate") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditUltimoAccesso" runat="server" Text='<%# Bind("LastLoginDate") %>' ReadOnly="True"></asp:TextBox> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Domanda di Sicurezza"> <ItemTemplate>
sabato 6 luglio 2013 Pag. 132 / 151

SVILUPPARE UN SITO WEB ASP.NET

<asp:Label ID="LblDomanda" runat="server" Text='<%# Bind("PasswordQuestion") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditDomanda" runat="server" Text='<%# Bind("PasswordQuestion") %>'></asp:TextBox> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Risposta"> <ItemTemplate> <asp:Label ID="LblRisposta" runat="server" Text='<%# Bind("PasswordAnswer") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditRisposta" runat="server" Text='<%# Bind("PasswordAnswer") %>'></asp:TextBox> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="e-mail"> <ItemTemplate> <asp:Label ID="LblEmail" runat="server" Text='<%# Bind("Email") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditEmail" runat="server" Text='<%# Bind("Email") %>'></asp:TextBox> <asp:RegularExpressionValidator ID="revTxtEditEmail" runat="server" ControlToValidate="TxtEditEmail" ValidationExpression="^([\w\\.]+)@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zAZ]{2,4}))$" Display="None" ErrorMessage="E-Mail: lasciare il campo vuoto o immettere un formato e-mail valido" /> </EditItemTemplate> </asp:TemplateField> <asp:BoundField DataField="nazione" HeaderText="Nazione" /> <asp:TemplateField HeaderText="C.A.P."> <ItemTemplate> <asp:Label ID="LblCAP" runat="server" Text='<%# Bind("cap") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditCAP" runat="server" Text='<%# Bind("cap") %>'></asp:TextBox> <asp:RegularExpressionValidator ID="revTxtEditCAP" runat="server" ControlToValidate="TxtEditCAP" ValidationExpression="\d{5}" Display="None" ErrorMessage="C.A.P.: Pu essere lasciato vuoto, ma se inserito deve avere cinque caratteri numerici" /> </EditItemTemplate> </asp:TemplateField> <asp:BoundField DataField="citt" HeaderText="Citt" /> <asp:BoundField DataField="provincia" HeaderText="Provincia" /> <asp:BoundField DataField="indirizzo" HeaderText="Indirizzo" /> <asp:TemplateField HeaderText="Tel.Casa"> <ItemTemplate> <asp:Label ID="LblTelCasa" runat="server" Text='<%# Bind("telcasa") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditTelCasa" runat="server" Text='<%# Bind("telcasa") %>'></asp:TextBox> <asp:RegularExpressionValidator ID="revTxtEditTelCasa" runat="server" ControlToValidate="TxtEditTelCasa" ValidationExpression="0{1}[0-9]{7,}" Display="None" ErrorMessage="Tel. Casa: Pu essere lasciato vuoto, ma se inserito deve avere almeno otto caratteri numerici, di cui il primo deve essere 0 (zero)" /> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Tel.Ufficio"> <ItemTemplate> <asp:Label ID="LblTelUfficio" runat="server" Text='<%# Bind("telufficio") %>'></asp:Label> </ItemTemplate> <EditItemTemplate>
sabato 6 luglio 2013 Pag. 133 / 151

SVILUPPARE UN SITO WEB ASP.NET

<asp:TextBox ID="TxtEditTelUfficio" runat="server" Text='<%# Bind("telufficio") %>'></asp:TextBox> <asp:RegularExpressionValidator ID="revTxtEditTelUfficio" runat="server" ControlToValidate="TxtEditTelUfficio" ValidationExpression="0{1}[0-9]{5,}" Display="None" ErrorMessage="Tel. Ufficio: Pu essere lasciato vuoto, ma se inserito deve avere almeno sei caratteri numerici, di cui il primo deve essere 0 (zero)" /> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Fax"> <ItemTemplate> <asp:Label ID="LblFax" runat="server" Text='<%# Bind("fax") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditFax" runat="server" Text='<%# Bind("fax") %>'></asp:TextBox> <asp:RegularExpressionValidator ID="revTxtEditFax" runat="server" ControlToValidate="TxtEditTelUfficio" ValidationExpression="0{1}[0-9]{5,}" Display="None" ErrorMessage="Tel. Ufficio: Pu essere lasciato vuoto, ma se inserito deve avere almeno sei caratteri numerici, di cui il primo deve essere 0 (zero)" /> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Cellulare"> <ItemTemplate> <asp:Label ID="LblCellulare" runat="server" Text='<%# Bind("cellulare") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditCellulare" runat="server" Text='<%# Bind("cellulare") %>'></asp:TextBox> <asp:RegularExpressionValidator ID="revTxtEditCellulare" runat="server" ControlToValidate="TxtEditCellulare" ValidationExpression="3{1}[0-9]{7,}" Display="None" ErrorMessage="Cellulare: Pu essere lasciato vuoto, ma se inserito deve avere almeno otto caratteri numerici, di cui il primo deve essere 3" /> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Sito Web"> <ItemTemplate> <asp:Label ID="LblSitoWeb" runat="server" Text='<%# Bind("sitoweb") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TxtEditSitoWeb" runat="server" Text='<%# Bind("sitoweb") %>'></asp:TextBox> <asp:RegularExpressionValidator ID="revTxtEditSitoWeb" runat="server" ControlToValidate="TxtEditSitoWeb" ValidationExpression="^http:\/\/(www\.)?[a-zA-Z0-9-]{3,}\.[a-zAZ]{2,}(\/)?$" Display="None" ErrorMessage="Sito Web: Pu essere lasciato vuoto, ma se inserito deve iniziare con http:// o con http://www." /> </EditItemTemplate> </asp:TemplateField> </Fields> <HeaderStyle BackColor="Tan" Font-Bold="True" /> <EditRowStyle BackColor="#FFBBAA" ForeColor="Blue" /> <AlternatingRowStyle BackColor="PaleGoldenrod" BorderStyle="Solid" BorderWidth="1px" VerticalAlign="Middle" Width="220px" Wrap="False" /> </asp:DetailsView> <br /> </div> <br /> </div> <hr /> <div id="secondario_largo"> <h2><a id="eliminaIscritto">Elimina Iscritti</a></h2><br /> <table border="0" style="font-size: 100%; font-family: Verdana"> <tr>
sabato 6 luglio 2013 Pag. 134 / 151

SVILUPPARE UN SITO WEB ASP.NET

<td align="right"> <asp:Label ID="ScegliIscritto" runat="server" AssociatedControlID="ListaIscritti">Scegli un Iscritto tra quelli della lista:</asp:Label> </td> <td> <asp:AccessDataSource ID="Source_Iscritti" runat="server" DataFile="~/mdb-database/ASPNetDB.mdb" SelectCommand="SELECT * FROM [IscrittiIdAccount]"></asp:AccessDataSource> <asp:DropDownList ID="ListaIscritti" runat="server" DataSourceID="Source_Iscritti" OnSelectedIndexChanged="ListaIscritti_SelectedIndexChanged" DataTextField="UserName" DataValueField="UserName" Width="100px" AutoPostBack="True"> </asp:DropDownList> </td> </tr> <tr> <td> <span class="inclinarosso"> <asp:Label ID="IscrittoScelto" runat="server" AssociatedControlID="TextUtenteScelto">Hai selezionato per l'eliminazione:</asp:Label> </span> </td> <td> <asp:TextBox ID="TextUtenteScelto" runat="server" Width="100px" ForeColor="Red"></asp:TextBox> <asp:TextBox ID="TextIDScelto" runat="server" Width="100px" ForeColor="Red"></asp:TextBox> </td> </tr> <tr> <td colspan="2"> <span class="inclinarosso"> <asp:Label ID="LabAvviso" runat="server">Se la selezione corretta premi il tasto Elimina, altrimenti Annulla o seleziona un altro iscritto</asp:Label> </span> </td> </tr> <tr> <td colspan="2" align="center"> <asp:Button ID="ButtonAnnulla" runat="server" Text="Annulla" OnClick="ButtonAnnulla_Click" />&nbsp;&nbsp;&nbsp;&nbsp; <asp:Button ID="ButtonElimina" runat="server" Text="Elimina Utente" OnClick="ButtonElimina_Click" /> </td> </tr> </table> <asp:Label ID="MsgEliminato" ForeColor="maroon" runat="server" Visible="true" /><br /><hr /> <h2><a id="modificaRuoli">Modifica l'assegnazione ai Ruoli</a></h2> <p>Ogni Iscritto pu appartenere ad un solo ruolo: quindi se occorre modificarlo, procedere prima alla cancellazione dell'attribuzione dal ruolo precedente</p><br /> <table border="0" style="font-size: 100%; font-family: Verdana" align="center"> <tr> <td align="center" colspan="2" style="font-weight: bold; color: white; background-color: #5d7b9d">Assegna un Ruolo</td> </tr> <tr> <td align="right"> <asp:Label ID="ScegliUtente" runat="server" AssociatedControlID="ListaUtenti">Scegli un Iscritto tra quelli della lista:</asp:Label> </td> <td> <asp:AccessDataSource ID="Access_IscrittiSenzaRuolo" runat="server" DataFile="~/mdb-database/ASPNetDB.mdb" SelectCommand="SELECT UserName FROM [IscrittiSenzaRuolo]"></asp:AccessDataSource> <asp:DropDownList ID="ListaUtenti" runat="server" DataSourceID="Access_IscrittiSenzaRuolo" DataTextField="UserName" DataValueField="UserName" Width="100px" AutoPostBack="false">
sabato 6 luglio 2013 Pag. 135 / 151

SVILUPPARE UN SITO WEB ASP.NET

</asp:DropDownList> </td> </tr> <tr> <td align="right"> <asp:Label ID="ScegliRuolo" runat="server" AssociatedControlID="ListaRuoli">Scegli un Ruolo tra quelli della lista:</asp:Label> </td> <td> <asp:AccessDataSource ID="Access_RuoliEsistenti" runat="server" DataFile="~/mdb-database/ASPNetDB.mdb" SelectCommand="SELECT RoleName FROM [aspnet_Roles]"></asp:AccessDataSource> <asp:DropDownList ID="ListaRuoli" runat="server" DataSourceID="Access_RuoliEsistenti" DataTextField="RoleName" DataValueField="RoleName" Width="100px" AutoPostBack="false"> </asp:DropDownList> </td> </tr> <tr> <td align="center" colspan="2"><br /> <asp:Button ID="AddUserButton" Text="Aggiungi l'Iscritto al ruolo selezionato" runat="server" OnClick="AddUserButton_Click" CausesValidation="False" /> </td> </tr> </table> <asp:Label ID="MsgRole" ForeColor="maroon" runat="server" Visible="true" /> <br /> <br /> <br /> <table border="0" style="font-size: 100%; font-family: Verdana" align="center"> <tr> <td align="center" colspan="2" style="font-weight: bold; color: white; background-color: #5d7b9d">Elimina l'assegnazione ad un Ruolo</td> </tr> <tr> <td align="center"> <asp:Label ID="Label4" runat="server" AssociatedControlID="ListaUtentiRuoli">Scegli un Iscritto:</asp:Label> </td> <td> <asp:AccessDataSource ID="AccessUtentiRuoli" runat="server" DataFile="~/mdb-database/ASPNetDB.mdb" SelectCommand="SELECT UserName, RoleName FROM [IscrittiConRuolo]"></asp:AccessDataSource> <asp:DropDownList ID="ListaUtentiRuoli" runat="server" DataSourceID="AccessUtentiRuoli" DataTextField="UserName" DataValueField="UserName" Width="100px" OnSelectedIndexChanged="ListaUtentiRuoli_SelectedIndexChanged" AutoPostBack="True"> </asp:DropDownList> </td> </tr> <tr> <td align="center"> <asp:Label ID="Label5" runat="server" AssociatedControlID="TextRuoloAttuale">Ruolo attuale:</asp:Label> </td> <td align="left"> <asp:TextBox ID="TextRuoloAttuale" runat="server" Width="100px" AutoPostBack="True"></asp:TextBox> </td> </tr> <tr> <td colspan="2"><br /> <asp:Button ID="EliminaDaRuolo" Text="Elimina l'assegnazione dell'Iscritto al ruolo" runat="server" OnClick="EliminaDaRuolo_Click" CausesValidation="False" /> </td> </tr> </table> <asp:Label ID="MsgNoRole" ForeColor="maroon" runat="server" Visible="true" /> </div> </div>
sabato 6 luglio 2013 Pag. 136 / 151

SVILUPPARE UN SITO WEB ASP.NET

<br /> <div id="footer"> <p class="valid">Webmaster: <asp:HyperLink ID="HyLkWebmaster" runat="server" NavigateUrl="mailto:domenico@decerbo.it">Domenico De Cerbo </asp:HyperLink> <asp:HyperLink ID="HyLkValidHTML" runat="server" NavigateUrl="http://validator.w3.org/check?uri=referer" ImageUrl="~/servizi/valid-xhtml10-blue.png" Height="31" Width="88" Text="Valid XHTML 1.0 Transitional"></asp:HyperLink>&nbsp &nbsp <asp:HyperLink ID="HyLkValidCSS" runat="server" NavigateUrl="http://validator.w3.org/check?uri=referer" ImageUrl="~/servizi/valid-css2-blue.png" Height="31" Width="88" Text="Valid CSS 2.0"></asp:HyperLink> </p> </div> </form> </body> </html> ADMIN\PANNELLO.ASPX.VB Partial Class admin_pannello Inherits System.Web.UI.Page Public Shared Ut_DaEliminare As String Public Shared Id_DaEliminare As Int32 Public Shared Utente_RuoloUtente As String Public Shared Ruolo_RuoloUtente As String Public Shared RuoloDaAssegnare As String Public Shared UtentePerRuolo As String Dim sqlNoRuolo As New System.Data.OleDb.OleDbCommand() Dim sqlUnicoNoRuolo As New System.Data.OleDb.OleDbCommand() Dim sqlUnicoConRuolo As New System.Data.OleDb.OleDbCommand() Dim strSQL As String Public Sub Page_Load() MsgEliminato.Text = "" MsgRole.Text = "" End Sub Function CreaStringaConnessione() As String Dim Parte1 As String, Parte2 As String, Parte3 As String Parte1 = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " Parte2 = Server.MapPath("~\mdb-database\ASPNetDB.mdb") Parte3 = "; Persist Security Info = False" CreaStringaConnessione = Parte1 & Parte2 & Parte3 End Function 'inizio modifica dati iscritto Public Function IscrittoSelezionato() As String Dim RecordSelezionato As GridViewRow = GridView_Pannello.SelectedRow IscrittoSelezionato = RecordSelezionato.Cells(2).Text End Function Protected Sub GridView_Pannello_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView_Pannello.SelectedIndexChanged Details_Pannello.ChangeMode(DetailsViewMode.ReadOnly) LabelSelezionato.Visible = "true" LabelSelezionato.Text = "Scheda di " & IscrittoSelezionato() End Sub Protected Sub GridView_Pannello_PageIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Details_Pannello.ChangeMode(DetailsViewMode.ReadOnly) End Sub Protected Sub GridView_Pannello_Sorted(ByVal sender As Object, ByVal e As System.EventArgs) Details_Pannello.ChangeMode(DetailsViewMode.ReadOnly) End Sub Protected Sub Details_Pannello_ItemUpdated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewUpdatedEventArgs) GridView_Pannello.DataBind() End Sub
sabato 6 luglio 2013 Pag. 137 / 151

SVILUPPARE UN SITO WEB ASP.NET

Protected Sub Details_Pannello_ModeChanged(ByVal sender As Object, ByVal e As System.EventArgs) If Details_Pannello.Visible = "true" Then Select Case Details_Pannello.CurrentMode Case DetailsViewMode.Edit LabelSelezionato.Visible = "true" LabelSelezionato.Text = "Modalit modifica - " & IscrittoSelezionato() End Select ElseIf Details_Pannello.Visible = "false" Then LabelSelezionato.Visible = "false" End If End Sub 'fine modifica dati iscritto 'inizio elimina iscritti Public Sub ListaIscritti_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListaIscritti.SelectedIndexChanged Dim IscrittoScelto As String MsgEliminato.Text = "" MsgRole.Text = "" IscrittoScelto = ListaIscritti.SelectedValue Ut_DaEliminare = IscrittoScelto Me.TextUtenteScelto.Text = IscrittoScelto Id_DaEliminare = RecuperaID(IscrittoScelto) Me.TextIDScelto.Text = Id_DaEliminare End Sub Public Function RecuperaID(ByVal CercaUtente As String) As Int32 Dim NrID As Int32, strSQL As String Dim sqlID As New System.Data.OleDb.OleDbCommand() Dim ConnID As New System.Data.OleDb.OleDbConnection() strSQL = "SELECT (UserId) FROM aspnet_Users WHERE UserName = '" & CercaUtente & "'" ConnID.ConnectionString = CreaStringaConnessione() sqlID.CommandText = strSQL sqlID.Connection = ConnID ConnID.Open() NrID = Convert.ToInt32(sqlID.ExecuteScalar()) Me.TextIDScelto.Text = NrID RecuperaID = NrID sqlID.Connection.Close() End Function Protected Sub ButtonAnnulla_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonAnnulla.Click Me.TextUtenteScelto.Text = "" Ut_DaEliminare = Nothing Me.TextIDScelto.Text = "" Id_DaEliminare = Nothing Me.MsgEliminato.Text = "" MsgRole.Text = "" End Sub Public Sub ButtonElimina_Click(ByVal sender As Object, ByVal args As System.EventArgs) Handles ButtonElimina.Click EliminaPredefiniti(Ut_DaEliminare) EliminaPersonalizzati(Id_DaEliminare) ListaIscritti.DataBind() ListaUtenti.DataBind() ListaUtentiRuoli.DataBind() GridView_Pannello.DataBind() Me.TextUtenteScelto.Text = "" Me.TextIDScelto.Text = "" Me.MsgEliminato.Text = "L'iscritto nr." & Id_DaEliminare & " - < " & Ut_DaEliminare & " > stato eliminato dal database" End Sub Public Sub EliminaPredefiniti(ByVal NomeUtentePerPred As String) Try Membership.DeleteUser(NomeUtentePerPred) Catch e As HttpException MsgEliminato.Text = "!! " & e.Message & " !!" Catch x As ArgumentException MsgEliminato.Text = x.ToString Catch prv As System.Configuration.Provider.ProviderException MsgEliminato.Text = "!! Errore del Provider su elimina predefiniti !!" End Try
sabato 6 luglio 2013 Pag. 138 / 151

SVILUPPARE UN SITO WEB ASP.NET

End Sub Public Sub EliminaPersonalizzati(ByVal IdUtentePerPers As Int32) Dim command As OleDbCommand, strCommand As String Dim ConnID As New System.Data.OleDb.OleDbConnection() strCommand = "DELETE FROM DatiAggiunti WHERE UserID = " & IdUtentePerPers ConnID.ConnectionString = CreaStringaConnessione() ConnID.Open() command = New OleDbCommand(strCommand, ConnID) command.ExecuteScalar() ConnID.Close() End Sub 'fine elimina iscritti 'inizio assegnazione a ruolo Protected Sub ListaUtenti_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListaUtenti.SelectedIndexChanged UtentePerRuolo = ListaUtenti.SelectedItem.Value MsgRole.Text = "" MsgNoRole.Text = "" End Sub Protected Sub ListaRuoli_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListaRuoli.SelectedIndexChanged RuoloDaAssegnare = ListaRuoli.SelectedItem.Value MsgRole.Text = "" MsgNoRole.Text = "" End Sub Public Sub AddUserButton_Click(ByVal sender As Object, ByVal args As System.EventArgs) Handles AddUserButton.Click MsgNoRole.Text = "" MsgRole.Text = "" If UtentePerRuolo Is Nothing Then UtentePerRuolo = UnicoSenzaRuolo() If RuoloDaAssegnare Is Nothing Then RuoloDaAssegnare = "Iscritti" Try Roles.AddUserToRole(UtentePerRuolo, RuoloDaAssegnare) Catch e As HttpException MsgRole.Text = "!! " & e.Message & " !!" Catch arg As System.ArgumentNullException Catch prv As System.Configuration.Provider.ProviderException 'problema da risolvere: se si attiva un messaggio, 'appare anche quando il ruolo stato assegnato correttamente 'MsgRole.Text = "errore provider" Finally If Details_Pannello.Visible Then Details_Pannello.DataBind() ListaUtenti.DataBind() ListaUtentiRuoli.DataBind() RuoloDaAssegnare = Nothing UtentePerRuolo = Nothing End Try End Sub Public Function UnicoSenzaRuolo() As String Dim strSQLUnicoNoRuolo As String Dim connUnicoNoRuolo As New System.Data.OleDb.OleDbConnection() strSQLUnicoNoRuolo = "SELECT UserName FROM IscrittiSenzaRuolo" connUnicoNoRuolo.ConnectionString = CreaStringaConnessione() sqlUnicoNoRuolo.CommandText = strSQLUnicoNoRuolo sqlUnicoNoRuolo.Connection = connUnicoNoRuolo connUnicoNoRuolo.Open() UnicoSenzaRuolo = sqlUnicoNoRuolo.ExecuteScalar() connUnicoNoRuolo.Close() End Function 'fine assegnazione a ruolo 'inizia elimina assegnazione ruolo Public Sub ListaUtentiRuoli_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListaUtentiRuoli.SelectedIndexChanged MsgRole.Text = "" MsgNoRole.Text = "" Utente_RuoloUtente = ListaUtentiRuoli.SelectedItem.Value Ruolo_RuoloUtente = RecuperaRuolo(Utente_RuoloUtente) TextRuoloAttuale.Text = Ruolo_RuoloUtente End Sub Public Function RecuperaRuolo(ByVal CercaUtenteRuolo As String) As String
sabato 6 luglio 2013 Pag. 139 / 151

SVILUPPARE UN SITO WEB ASP.NET

Dim strSQL As String Dim sqlRole As New System.Data.OleDb.OleDbCommand() Dim ConnRole As New System.Data.OleDb.OleDbConnection() strSQL = "SELECT (RoleName) FROM IscrittiConRuolo WHERE UserName = '" & CercaUtenteRuolo & "'" ConnRole.ConnectionString = CreaStringaConnessione() sqlRole.CommandText = strSQL sqlRole.Connection = ConnRole ConnRole.Open() RecuperaRuolo = Convert.ToString(sqlRole.ExecuteScalar()) sqlRole.Connection.Close() End Function Public Sub EliminaDaRuolo_Click(ByVal sender As Object, ByVal args As System.EventArgs) Handles EliminaDaRuolo.Click If Utente_RuoloUtente Is Nothing Then Utente_RuoloUtente = UnicoConRuolo() Ruolo_RuoloUtente = RecuperaRuolo(Utente_RuoloUtente) TextRuoloAttuale.Text = Ruolo_RuoloUtente Exit Sub End If Try Roles.RemoveUserFromRole(Utente_RuoloUtente, Ruolo_RuoloUtente) Catch e As HttpException MsgNoRole.Text = "!! " & e.Message & " !!" Catch arg As System.ArgumentNullException Catch prv As System.Configuration.Provider.ProviderException 'problema da risolvere: se si attiva un messaggio, 'appare anche quando l'assegnazione al ruolo stata eliminata correttamente 'MsgNoRole.Text = "errore provider" Finally If Utente_RuoloUtente Is Nothing Then MsgNoRole.Text = "!! Tutti gli utenti sono senza ruolo !!" Else If Details_Pannello.Visible Then Details_Pannello.DataBind() ListaUtenti.DataBind() ListaUtentiRuoli.DataBind() MsgNoRole.Text = "All'utente < " & Utente_RuoloUtente & " > stata tolta l'assegnazione al ruolo < " & Ruolo_RuoloUtente & " >" Ruolo_RuoloUtente = Nothing Utente_RuoloUtente = Nothing End If End Try End Sub Public Function UnicoConRuolo() As String Dim strSQLUnicoConRuolo As String Dim connUnicoConRuolo As New System.Data.OleDb.OleDbConnection() strSQLUnicoConRuolo = "SELECT UserName FROM IscrittiConRuolo WHERE Not RoleName = 'Amministratori'" connUnicoConRuolo.ConnectionString = CreaStringaConnessione() sqlUnicoConRuolo.CommandText = strSQLUnicoConRuolo sqlUnicoConRuolo.Connection = connUnicoConRuolo connUnicoConRuolo.Open() UnicoConRuolo = sqlUnicoConRuolo.ExecuteScalar() connUnicoConRuolo.Close() End Function 'fine elimina assegnazione ruolo End Class PRIVATE\WEB.CONFIG <?xml version="1.0" encoding="utf-8"?> <configuration> <system.web> <authorization> <allow roles="Amministratori" /> <allow roles="Iscritti" /> <deny users="?" /> </authorization> </system.web> </configuration>
sabato 6 luglio 2013 Pag. 140 / 151

SVILUPPARE UN SITO WEB ASP.NET

PRIVATE\BASE.CSS /* elementi per la struttura */ body{ font-family: Arial,sans-serif; color: #FF3333; line-height: 1.166; margin: 0px; padding: 0px; background-color: #F2F2F2; height: 100%; } #intestazione{ padding: 10px 0px 9px 0px; border-bottom: 1px solid #cccccc; width: 100%; border-color: #DDFFDD; } #int_Pulsanti{ padding: 1px; margin: 1px; background: #FFFFCC; color: #FF0000; border-top: 1px solid #000; border-bottom: 1px solid #000; border-top-width: 1px; border-bottom-width: 1px; border-top-color: #999999; border-bottom-color: #999999; font-family: Arial, Helvetica, sans-serif; font-weight: lighter; text-align: right; } #int_sg{ background-position: #CCFFCC; margin: 1px; height: 25px; background: #CCFFCC; border-top: 1px solid #000; border-bottom: 1px solid #000; border-top-width: 1px; border-bottomwidth: 1px; border-top-color: #999999; border-bottom-color: #999999; text-align: center; font-family: Arial, Helvetica, sans-serif; font-size: 100%; color: #B9B900; verticalalign: middle; font-weight: lighter; text-align: right; letter-spacing: 1.5em; } #Menu{ font-size: 90%; background-position: #CCCCCC; padding: 1px 1px 1px 10px; margin: 0px; background: #E2E2E2; color: #3333FF; border-bottom: 1px solid #000; border-bottom-width: 1px; border-bottom-color: #999999; font-family: Arial, Helvetica, sans-serif; text-align: left; border-bottom-style: solid; height: 25px; } #corpo_sx{ width: 20%; color: #336600; float: left; padding: 10px; position: relative; margin: 10px 5px 5px 5px; border-bottom: 1px solid #cccccc; font-size: 90%; border-color: #F2F2F2; font-family: Arial, Helvetica, sans-serif; height: 100%; } #corpo_centro{ border: thin solid #D4D4D4; padding: 10px; margin: 10px 5px 5px 5px; width: 56%; background-color: #FEFEFE; height: 100%; font-family: Verdana; color: #0000C4; } #corpo_centro_largo{ border: thin solid #D4D4D4; padding: 10px; margin: 10px 5px 5px 5px; width: 70%; background-color: #FEFEFE; height: 100%; font-family: Verdana; color: #0000C4; } #corpo_dx{ float: right; width: 15%; border-left: 1px solid #cccccc; border-bottom: 1px solid #cccccc; margin: 10px 5px 5px 5px; padding: 10px 0px 20px 10px; font-size: 90%; bordercolor: #F2F2F2; font-family: 'Times New Roman' , Times, serif; color: #990033; height: 100%; } #corpo-sx .box, #corpo-dx .box, #corpo_centro .box{ padding: 10px; } #piede_1{ border-style: solid; border-width: thin 0px 0px 0px; border-color: #C9C9C9 #F2F2F2 #F2F2F2 #F2F2F2; clear: both; font-size: 75%; color: #FF3300; padding: 10px 10px 10px 10px; vertical-align: middle; font-family: Arial, Helvetica, sans-serif; } #corpo_sx_sg{ width: 20%; color: #336600; float: left; padding: 10px; position: relative; margin: 10px 5px 5px 5px; border-bottom: 1px solid #cccccc; font-size: 90%; border-color: #F2F2F2; font-family: Arial, Helvetica, sans-serif; height: 100%; } #corpo_centro_sg{ border: thin solid #D4D4D4; padding: 10px; margin: 10px 5px 5px 5px; float: left; width: 56%; background-color: #FEFEFE; height: 100%; font-family: Verdana; color: #0000C4; }
sabato 6 luglio 2013 Pag. 141 / 151

SVILUPPARE UN SITO WEB ASP.NET

#corpo_dx_sg{ float: right; width: 15%; border-left: 1px solid #cccccc; border-bottom: 1px solid #cccccc; margin: 10px 5px 5px 5px; padding: 10px 0px 20px 10px; font-size: 90%; bordercolor: #F2F2F2; font-family: 'Times New Roman' , Times, serif; color: #990033; height: 100%; } #piede_sg{ border-style: solid; border-width: thin 0px 0px 0px; border-color: #C9C9C9 #F2F2F2 #F2F2F2 #F2F2F2; clear: both; font-size: 75%; color: #FF3300; padding: 10px 10px 10px 10px; vertical-align: middle; font-family: Arial, Helvetica, sans-serif; } .valid{ display: block; float: right; font-family: Verdana; font-size: xx-small; color: #0000FF; padding-left: 5px; padding-right: 5px; } /* Elementi per paragrafi */ h1{ font-family: Arial, Helvetica, sans-serif; font-size: 220%; color: #CA2B29; text-align: center; text-decoration: underline; padding: 0 0 0 0; margin: 0 0 0 0; } h2{ font-family: Helvetica, sans-serif; font-size: 160%; color: Blue; text-align: center; text-decoration: underline; margin: 0px; padding: 0px; } h3{ font-family: Helvetica, sans-serif; font-size: 120%; color: Teal; font-weight: bolder; text-align: center; font-style: italic; margin: 0px; padding: 0px; } #corpo_sx h3{ padding: 10px 0px 2px 10px; } h4{ font-family: Helvetica, sans-serif; font-size: 110%; color: Green; text-align: center; font-style: italic; margin: 5px 5px 0px 15px; padding: 0px; } h5{ font-family: Helvetica, sans-serif; margin: 0px; padding: 0px; } ul{ list-style-type: square; } ul ul{ list-style-type: disc; } ul ul ul{ list-style-type: none; } a{ color: #006699; text-decoration: none; } #corpo_sx a{ display: block; border-top: 1px solid #cccccc; padding: 2px 0px 2px 10px; } a:link{ color: #006699; text-decoration: none; } a:visited{ color: #006699; text-decoration: none; } a:hover{ color: #006699; text-decoration: underline; } #corpo_sx a:hover{
sabato 6 luglio 2013 Pag. 142 / 151

SVILUPPARE UN SITO WEB ASP.NET

background-color: #dddddd; } #corpo_dx p{ padding: 5px 0px 5px 0px; } /* Elementi per grafica */ #intestimg{ display: block; float: left; border: 1px double Teal; } .imgdx{ padding: 3px; margin: 4px; display: block; float: right; border: medium double Teal; } .imgsx{ border-style: solid; border-width: 1px; border-color: inherit; padding: 3px; margin: 1px 5px 1px 10px; display: block; float: left; height: 100px; } /* Elementi formattazione caratteri */ .inclinarosso{ font-style: oblique; color: Red; font-size: 98%; } .inclina{ font-style: oblique; color: Navy; font-size: 120%; } .fucsia{ color: Fuchsia; } .azzurro{ color: #3366CC; } .centra{ color: #CC3300; } .legale{ color: #CE0000; font-size: 90%; font-family: "Courier New" , Courier, monospace; fontstyle: italic; padding-right: 5px; padding-left: 15px; } PRIVATE\PRIM_ISCRITTI.MASTER <%@ Master Language="VB" CodeFile="Prim_Iscritti.master.vb" Inherits="private_Prim_Iscritti" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> <meta name="description" content="" /> <meta name="keywords" content="" /> <title>Sito di Prove</title> <link rel="stylesheet" href="base.css" type="text/css" /> </head> <body> <form id="MP_Principale" runat="server"> <div id="intestazione"> <asp:Image ID="Logo" runat="server" ImageUrl="~/servizi/img/logo.jpg" GenerateEmptyAlternateText="true" AlternateText="Logo" CssClass="imgsx" /> <h1>Intestazione SitoProve</h1> <h2>Sottointestazione</h2> <h4>Altre informazioni</h4> </div> <div id="int_iscritti"> <asp:LoginView ID="LoginView1" runat="server"> <RoleGroups> <asp:RoleGroup Roles="Iscritti"> <ContentTemplate>

sabato 6 luglio 2013 Pag. 143 / 151

SVILUPPARE UN SITO WEB ASP.NET

<h5><span class="azzurro"><span class="espanso">Area Iscritti Utente collegato: &nbsp; &nbsp;<asp:LoginName ID="LoginName1" runat="server" /></span></span></h5> </ContentTemplate> </asp:RoleGroup> </RoleGroups> </asp:LoginView> <asp:LoginStatus ID="LoginStatus1" runat="server" LogoutText=" L o g o u t " LogoutAction="Redirect" LogoutPageUrl="~/Default.aspx" BackColor="#E6E6E6" BorderColor="Silver" BorderStyle="Solid" BorderWidth="1px" FontNames="Verdana" Font-Size="12pt" ForeColor="#FF3300"> </asp:LoginStatus> </div> <div id="Menu"> <asp:SiteMapDataSource ID="siteMapDataSource" runat="server" SiteMapProvider="Iscritti" /> <asp:Menu ID="MenuIscritti" runat="server" DataSourceID="siteMapDataSource" BackColor="#F7F6F3" DynamicHorizontalOffset="2" Font-Names="Verdana" FontSize="0.8em" ForeColor="#7C6F57" StaticSubMenuIndent="10px" BorderStyle="Solid" BorderWidth="1"> <StaticSelectedStyle BackColor="#BBC8D7" /> <StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" /> <DynamicHoverStyle BackColor="#CFC8BA" ForeColor="White" /> <DynamicMenuStyle BackColor="#F7F6F3" /> <DynamicSelectedStyle BackColor="#D3DCE4" /> <DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" /> <StaticHoverStyle BackColor="#C7BEAF" ForeColor="White" /> </asp:Menu> </div> <asp:ContentPlaceHolder ID="Sinistra" runat="server"> </asp:ContentPlaceHolder> <asp:ContentPlaceHolder ID="Destra" runat="server"> </asp:ContentPlaceHolder> <asp:ContentPlaceHolder ID="Centro" runat="server"> </asp:ContentPlaceHolder> <div id="footer"> <div class="box"> <p class="legale">I documenti contenuti all'interno del sito sono riprodotti elettronicamente a titolo informativo, riveste valore legale solo la documentazione originale depositata in sedep></p> <p class="valid">Webmaster: <asp:HyperLink ID="HyLkWebmaster" runat="server" NavigateUrl="mailto:domenico@decerbo.it">Domenico De Cerbo </asp:HyperLink> <asp:HyperLink ID="HyLkValidHTML" runat="server" NavigateUrl="http://validator.w3.org/check?uri=referer" ImageUrl="~/servizi/valid-xhtml10-blue.png" Height="31" Width="88" Text="Valid XHTML 1.0 Transitional"></asp:HyperLink>&nbsp &nbsp <asp:HyperLink ID="HyLkValidCSS" runat="server" NavigateUrl="http://validator.w3.org/check?uri=referer" ImageUrl="~/servizi/valid-css2-blue.png" Height="31" Width="88" Text="Valid CSS 2.0"></asp:HyperLink> </p> </div> </div> </form> </body> </html> PRIVATE\PRIM_ISCRITTI.MASTER.VB Partial Class private_Prim_Iscritti Inherits System.Web.UI.MasterPage End Class PRIVATE\ISCRITTI_HOME.ASPX <%@ Page Title="Pagina Iscritti" Language="VB" ResponseEncoding="iso-8859-15" Explicit="true" MasterPageFile="Prim_Iscritti.master" AutoEventWireup="true" CodeFile="iscritti_home.aspx.vb" Inherits="private_iscritti_home" %> <asp:Content ID="Content21" ContentPlaceHolderID="Sinistra" runat="Server"> <div id="corpo_sx"> <div class="box">
sabato 6 luglio 2013 Pag. 144 / 151

SVILUPPARE UN SITO WEB ASP.NET

<span class="inclinarosso">Siamo nell'area Iscritti - Home</span> Area per i link etc. </div> </div> </asp:Content> <asp:Content ID="Content22" ContentPlaceHolderID="Centro" runat="Server"> <div id="corpo_centro"> <div class="box"> <span class="inclinarosso">Siamo nell'area Iscritti - Home</span> Area principale per il testo </div> </div> </asp:Content> <asp:Content ID="Content23" ContentPlaceHolderID="Destra" runat="Server"> <div id="corpo_dx"> <div class="box"> <span class="inclinarosso">Siamo nell'area Iscritti - Home</span> Area per news avvisi etc. </div> </div> </asp:Content> PRIVATE\ISCRITTI_HOME.ASPX.VB Partial Class private_iscritti_home Inherits System.Web.UI.Page End Class PRIVATE\PAG1.ASPX <%@ Page Title="Pag.1" Language="VB" MasterPageFile="Prim_Iscritti.master" AutoEventWireup="true" ResponseEncoding="iso-8859-15" Explicit="true" CodeFile="Pag1.aspx.vb" Inherits="private_Pag1" %> <asp:Content ID="Content101" ContentPlaceHolderID="Sinistra" runat="Server"> <div id="corpo_sx"> <div class="box"> <span class="inclinarosso">Siamo nell'area Iscritti - Pagina 1</span> Area per i link etc. </div> </div> </asp:Content> <asp:Content ID="Content102" ContentPlaceHolderID="Centro" runat="Server"> <div id="corpo_centro"> <div class="box"> <span class="inclinarosso">Siamo nell'area Iscritti - Pagina 1</span> Area principale per il testo </div> </div> </asp:Content> <asp:Content ID="Content103" ContentPlaceHolderID="Destra" runat="Server"> <div id="corpo_dx"> <div class="box"> <span class="inclinarosso">Siamo nell'area Iscritti - Pagina 1</span> Area per news avvisi etc. </div> </div> </asp:Content> PRIVATE\PAG1.ASPX.VB Partial Class private_Pag1 Inherits System.Web.UI.Page End Class PRIVATE\PAGEXCEL.ASPX <%@ Page Title="Pag.Excel" Language="VB" MasterPageFile="Prim_Iscritti.master" AutoEventWireup="true" ResponseEncoding="iso-8859-15" Explicit="true" CodeFile="PagExcel.aspx.vb" Inherits="private_PagExcel" %> <%@ Register Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI.WebControls" TagPrefix="asp" %>
sabato 6 luglio 2013 Pag. 145 / 151

SVILUPPARE UN SITO WEB ASP.NET

<asp:Content ID="Content1" ContentPlaceHolderID="Sinistra" runat="Server"> <div id="corpo_sx"> <div class="box"> <span class="inclinarosso">Siamo nell'area Iscritti - Excel</span> <a>Facendo click sui link sottostanti, verranno visualizzati i relativi documenti.</a> <a>Per tornare a questa pagina cliccare sulla freccia Indietro del browser</a><hr /> <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="../servizi/Excel_Doc.mht" Target="_self" Font-Underline="True" ForeColor="#0066FF" Font-Size="10">Documento integrale</asp:HyperLink> </div> </div> </asp:Content> <asp:Content ID="Content3" ContentPlaceHolderID="Centro" runat="Server"> <div id="corpo_centro_largo"> <span class="inclinarosso">Passo 1 : Selezionare il documento di Excel da cui estrarre i dati</span><br /> <asp:ListBox ID="Step1_ListBox" runat="server" Height="30px" Width="200"></asp:ListBox>&nbsp; &nbsp; <asp:Button ID="Step1_Button_Procedi" runat="server" Text="Procedi >" /><br /> <asp:Label ID="Step1_Label_Msg" runat="server" Visible="False" Font-Italic="True" ForeColor="#FF3300"></asp:Label><br /> <div class="boxdetails"><hr /> <asp:Label ID="Step2_Label_Titolo" runat="server" Text="Passo 2 : Scegli i dati da estrarre :" Visible="False"></asp:Label><br /> <asp:RadioButtonList ID="Step2_Radio_Intervallo" runat="server" Visible="False" TabIndex="0"> <asp:ListItem Value="1">Dati Iscritti</asp:ListItem> <asp:ListItem Value="2">Pagamento quote</asp:ListItem> <asp:ListItem Value="3">Una colonna</asp:ListItem> <asp:ListItem Value="4">Tutte le e-mail</asp:ListItem> <asp:ListItem Value="5">E-mail di un utente</asp:ListItem> </asp:RadioButtonList> <asp:Button ID="Step2_Button_Procedi" runat="server" Text="Procedi >" Visible="False" /><br /> <asp:Label ID="Step2_Label_Msg" runat="server" Visible="False" FontItalic="True" ForeColor="#FF3300"></asp:Label><hr /><br /> <asp:GridView ID="Step3_GridExcel" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None" Visible="False"> <RowStyle BackColor="#FFFBD6" ForeColor="#333333" /> <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" /> <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" /> <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" /> <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" /> <AlternatingRowStyle BackColor="White" /> </asp:GridView> <asp:Label ID="Step3_Label_Msg" runat="server" Visible="False" FontItalic="True" ForeColor="#FF3300"></asp:Label><br /> <asp:Button ID="Step3_Button_Indietro" runat="server" Text="< Indietro" Visible="False" /><br /> </div> <div class="boxdetails"><br /> <a><asp:Label ID="Step2_2_Label_Titolo" runat="server" Text="Seleziona l'Iscritto di cui vedere le quote pagate:" Visible="False" AssociatedControlID="Step2_2_ListBox_Utenti"></asp:Label></a><br /> <asp:AccessDataSource ID="DataSourceUtenti" runat="server" DataFile="~/mdbdatabase/ASPNetDB.mdb" SelectCommand="SELECT UserName FROM [SpecIscritti] WHERE IsApproved = true ORDER BY UserName"></asp:AccessDataSource> <asp:ListBox ID="Step2_2_ListBox_Utenti" runat="server" Height="200px" Width="150" DataSourceID="DataSourceUtenti" DataTextField="UserName" Visible="False" SelectionMode="Single" ></asp:ListBox><br /> <asp:Label ID="Step2_2_Label_Msg" runat="server" Visible="False" FontItalic="True" ForeColor="#FF3300"></asp:Label><br /> <asp:Button ID="Step2_2_Button_Indietro" runat="server" Text="< Annulla" Visible="False" />&nbsp; &nbsp; <asp:Button ID="Step2_2_Button_Avanti" runat="server" Text="Procedi >" Visible="False" /><br /> </div> </div> </asp:Content>

sabato 6 luglio 2013 Pag. 146 / 151

SVILUPPARE UN SITO WEB ASP.NET

PRIVATE\PAGEXCEL.ASPX.VB Partial Class private_PagExcel Inherits System.Web.UI.Page Public Shared NrExcel As Int16 Public Shared NomeExcel As String Public Shared NomeConEstensione As String Public Shared PathNomeExcel As String Public Shared CartellaSystemExcel As String Public Shared strSQL As String Public Shared SelUtente As String 'in un progetto definitivo si dovrebbero mettere qui 'come costanti pubbliche tutti i riferimenti ad 'Excel richiamati dal codice Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not IsPostBack Then CartellaSystemExcel = Server.MapPath("~\servizi\") ElencaFile() End If End Sub Public Function StringaConnessione(ByVal FileExcel As String) As String Dim builder As New OleDbConnectionStringBuilder() Dim NomePercorsoExcel As String = "~\servizi\" & FileExcel builder.ConnectionString = "Data Source=" & Server.MapPath(NomePercorsoExcel) builder.Add("Provider", "Microsoft.Jet.OLEDB.4.0") builder.Add("Extended Properties", "Excel 8.0") StringaConnessione = builder.ToString End Function Sub ElencaFile() NrExcel = 0 For Each foundFile As String In My.Computer.FileSystem.GetFiles(CartellaSystemExcel) If Right(foundFile, 3) = "xls" Then PathNomeExcel = foundFile NomeExcel = SoloNomeExcel(PathNomeExcel) Me.Step1_ListBox.Items.Add(NomeExcel) NrExcel = NrExcel + 1 End If Next Me.Step1_ListBox.Height = Me.Step1_ListBox.Height.Value * NrExcel End Sub Function SoloNomeExcel(ByVal Completo As String) As String Dim Lunghezza As Integer, X As Integer, Y As Integer Dim Parziale As String Dim Caratteri(0) As String Dim Posizione As Integer Completo = Trim(Completo) Lunghezza = Len(Completo) For X = 0 To Lunghezza - 1 Posizione = Lunghezza + 1 - X If Not Mid(Completo, Posizione, 1) = Chr(92) Then Caratteri(X) = Mid(Completo, Posizione, 1) ReDim Preserve Caratteri(UBound(Caratteri) + 1) Else Exit For End If Next Parziale = "" For Y = UBound(Caratteri) - 1 To 1 Step -1 Parziale = Parziale & Caratteri(Y) Next Parziale = Replace(Parziale, ".xls", "") SoloNomeExcel = Parziale End Function Protected Sub Step1_Button_Procedi_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Step1_Button_Procedi.Click If Me.Step1_ListBox.SelectedItem Is Nothing Then Me.Step1_Label_Msg.Visible = True Me.Step1_Label_Msg.Text = "!! Selezionare un documento Excel !!" Else
sabato 6 luglio 2013 Pag. 147 / 151

SVILUPPARE UN SITO WEB ASP.NET

NomeConEstensione = Step1_ListBox.SelectedItem.ToString & ".xls" Me.Step1_Label_Msg.Visible = False Me.Step2_Label_Titolo.Visible = True Me.Step2_Radio_Intervallo.Visible = True Me.Step2_Button_Procedi.Visible = True End If End Sub Protected Sub Step2_Button_Procedi_Click(ByVal sender As Object, ByVal args As System.EventArgs) Handles Step2_Button_Procedi.Click Me.Step2_Label_Msg.Visible = False Me.Step2_2_Label_Titolo.Visible = False Me.Step2_2_ListBox_Utenti.Visible = False Me.Step2_2_Button_Avanti.Visible = False Me.Step2_2_Button_Indietro.Visible = False Me.Step2_2_Label_Msg.Visible = False Me.Step3_Label_Msg.Visible = False Me.Step3_Button_Indietro.Visible = False strSQL = "" Select Case Me.Step2_Radio_Intervallo.SelectedValue Case 1 strSQL = "SELECT * FROM GruppoUtenti" Me.Step3_GridExcel.ShowHeader = True Case 2 Me.Step2_2_Label_Titolo.Visible = True Me.Step2_2_ListBox_Utenti.Visible = True Me.Step2_2_Button_Avanti.Visible = True Me.Step2_2_Button_Indietro.Visible = True Me.Step3_GridExcel.Visible = False Exit Sub Case 3 strSQL = "SELECT * FROM [Foglio1$C1:C5]" Me.Step3_GridExcel.ShowHeader = True Case 4 strSQL = "SELECT * FROM [Foglio1$C1:D5]" Me.Step3_GridExcel.ShowHeader = True Case 5 strSQL = "SELECT * FROM [Foglio1$C2:D3]" Me.Step3_GridExcel.ShowHeader = False Case Else Me.Step2_Label_Msg.Visible = True Me.Step2_Label_Msg.Text = "!! Seleziona un'opzione !!" Exit Sub End Select Me.Step3_GridExcel.Visible = True Me.Step3_Button_Indietro.Visible = True Try Dim ConnExcel As New OleDbConnection(StringaConnessione(NomeConEstensione)) Dim query As OleDbDataAdapter = New OleDbDataAdapter(strSQL, ConnExcel) Dim querydataset As New DataSet() query.Fill(querydataset, 0) Me.Step3_GridExcel.DataSource = querydataset.Tables(0).DefaultView Me.Step3_GridExcel.DataBind() ConnExcel.Close() Catch ex As System.Data.OleDb.OleDbException Me.Step3_GridExcel.Visible = False Me.Step3_Button_Indietro.Visible = False Me.Step3_Label_Msg.Visible = True Me.Step3_Label_Msg.Text = "!! Errore nell'accesso ai dati. Spostarsi su " _ & "un'altra pagina del sito, poi " _ & "tornare su questa e riprovare !!" End Try End Sub Protected Sub Step3_Button_Indietro_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Step3_Button_Indietro.Click Me.Step1_ListBox.ClearSelection() Me.Step2_Label_Titolo.Visible = False Me.Step2_Radio_Intervallo.ClearSelection() Me.Step2_Radio_Intervallo.Visible = False Me.Step2_Button_Procedi.Visible = False Me.Step2_Label_Msg.Visible = False Me.Step2_2_Label_Titolo.Visible = False Me.Step2_2_ListBox_Utenti.Visible = False Me.Step2_2_Button_Indietro.Visible = False
sabato 6 luglio 2013 Pag. 148 / 151

SVILUPPARE UN SITO WEB ASP.NET

Me.Step2_2_Button_Avanti.Visible = False Me.Step2_2_Label_Msg.Visible = False Me.Step3_GridExcel.Visible = False Me.Step3_Button_Indietro.Visible = False Me.Step3_Label_Msg.Visible = False End Sub Protected Sub Step2_2_Button_Indietro_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Step2_2_Button_Indietro.Click Me.Step2_2_Label_Titolo.Visible = False Me.Step2_2_ListBox_Utenti.Visible = False Me.Step2_2_Button_Avanti.Visible = False Me.Step2_2_Button_Indietro.Visible = False Me.Step2_2_Label_Msg.Visible = False Me.Step3_GridExcel.Visible = False Me.Step3_Button_Indietro.Visible = False Me.Step3_Label_Msg.Visible = False End Sub Protected Sub Step2_2_Button_Avanti_Click(ByVal sender As Object, ByVal args As System.EventArgs) Handles Step2_2_Button_Avanti.Click Me.Step3_Label_Msg.Visible = False SelUtente = Nothing Me.Step2_2_Label_Msg.Visible = False SelUtente = Me.Step2_2_ListBox_Utenti.SelectedValue If SelUtente Is Nothing Then Me.Step2_2_Label_Msg.Visible = True Me.Step2_2_Label_Msg.Text = "!! Occorre selezionare un iscritto !!" Else Me.Step2_2_Label_Msg.Visible = False MostraQuote(SelUtente) End If End Sub Public Sub MostraQuote(ByVal UtenteSelezionato As String) Dim QuoteUtente As String = UtenteSelezionato & "_Quote_2008" strSQL = "SELECT * FROM " & QuoteUtente Me.Step3_GridExcel.ShowHeader = True Me.Step3_GridExcel.Visible = True Me.Step3_Button_Indietro.Visible = True Try Dim ConnExcel As New OleDbConnection(StringaConnessione(NomeConEstensione)) Dim query As OleDbDataAdapter = New OleDbDataAdapter(strSQL, ConnExcel) Dim querydataset As New DataSet() query.Fill(querydataset, 0) Me.Step3_GridExcel.DataSource = querydataset.Tables(0).DefaultView Me.Step3_GridExcel.DataBind() ConnExcel.Close() Catch ex As System.Data.OleDb.OleDbException Me.Step3_GridExcel.Visible = False Me.Step3_Button_Indietro.Visible = False Me.Step3_Label_Msg.Visible = True Me.Step3_Label_Msg.Text = "!! L'Iscritto selezionato non ha quote registrate !!" End Try End Sub End Class PRIVATE\PAGW ORD.ASPX <%@ Page Title="Pag.1" Language="VB" MasterPageFile="Prim_Iscritti.master" AutoEventWireup="true" ResponseEncoding="iso-8859-15" Explicit="true" CodeFile="PagWord.aspx.vb" Inherits="private_PagWord" %> <%@ Register Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI.WebControls" TagPrefix="asp" %> <asp:Content ID="Content1" ContentPlaceHolderID="Sinistra" Runat="Server"> <div id="corpo_sx"> <div class="box"> <span class="inclinarosso">Siamo nell'area Iscritti - Word</span> <a>Facendo click sui link sottostanti, verranno visualizzati i relativi documenti.</a> <a>Per tornare a questa pagina cliccare sulla freccia Indietro del browser</a><hr />
sabato 6 luglio 2013 Pag. 149 / 151

SVILUPPARE UN SITO WEB ASP.NET

<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="../servizi/Tutorial pratico - Creare un sito.mht" Target="_self" Font-Underline="True" ForeColor="#0066FF" Font-Size="10">Documento integrale</asp:HyperLink> </div> </div> </asp:Content> <asp:Content ID="Content3" ContentPlaceHolderID="Centro" Runat="Server"> <div id="corpo_centro_largo"> <div class="box"> <span class="inclinarosso">Selezionare il documento di Word di cui vedere il Sommario</span><br /> <asp:ListBox ID="Step1_ListBox" runat="server" Height="30px" Width="400"></asp:ListBox>&nbsp; &nbsp; <asp:Button ID="Step1_Button_Procedi" runat="server" Text="Procedi >" /><br /> <asp:Label ID="Step1_Label_Msg" runat="server" Visible="False" FontItalic="True" ForeColor="#FF3300"></asp:Label><hr /><br /> <asp:GridView ID="Step3_GridWord" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None" Visible="False"> <RowStyle BackColor="#FFFBD6" ForeColor="#333333" /> <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" /> <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" /> <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" /> <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" /> <AlternatingRowStyle BackColor="White" /> </asp:GridView> <asp:Label ID="Step3_Label_Msg" runat="server" Visible="False" FontItalic="True" ForeColor="#FF3300"></asp:Label><br /> <asp:Button ID="Step3_Button_Indietro" runat="server" Text="< Indietro" Visible="False" /><br /> </div> </div> </asp:Content> PRIVATE\PAGW ORD.ASPX.VB Partial Class private_PagWord Inherits System.Web.UI.Page Public Shared NrWord As Int16 Public Shared NomeWord As String Public Shared NomeConEstensione As String Public Shared PathNomeWord As String Public Shared CartellaSystemWord As String Public Shared CartellaSystemExcel As String Public Shared strSQL As String 'Public Shared SelUtente As String 'in un progetto definitivo si dovrebbero mettere qui 'come costanti pubbliche tutti i riferimenti ad 'Word richiamati dal codice Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not IsPostBack Then CartellaSystemWord = Server.MapPath("~\servizi\") CartellaSystemExcel = Server.MapPath("~\servizi\") ElencaFile() End If End Sub Public Function StringaConnessione() As String Dim builder As New OleDbConnectionStringBuilder() Dim NomePercorsoExcel As String = "~\servizi\Excel_Doc.xls" builder.ConnectionString = "Data Source=" & Server.MapPath(NomePercorsoExcel) builder.Add("Provider", "Microsoft.Jet.OLEDB.4.0") builder.Add("Extended Properties", "Excel 8.0") StringaConnessione = builder.ToString End Function Sub ElencaFile() NrWord = 0 For Each foundFile As String In My.Computer.FileSystem.GetFiles(CartellaSystemWord) If Right(foundFile, 3) = "doc" Then PathNomeWord = foundFile
sabato 6 luglio 2013 Pag. 150 / 151

SVILUPPARE UN SITO WEB ASP.NET

NomeWord = SoloNomeWord(PathNomeWord) Me.Step1_ListBox.Items.Add(NomeWord) NrWord = NrWord + 1 End If Next Me.Step1_ListBox.Height = Me.Step1_ListBox.Height.Value * NrWord End Sub Function SoloNomeWord(ByVal Completo As String) As String Dim Lunghezza As Integer, X As Integer, Y As Integer Dim Parziale As String Dim Caratteri(0) As String Dim Posizione As Integer Completo = Trim(Completo) Lunghezza = Len(Completo) For X = 0 To Lunghezza - 1 Posizione = Lunghezza + 1 - X If Not Mid(Completo, Posizione, 1) = Chr(92) Then Caratteri(X) = Mid(Completo, Posizione, 1) ReDim Preserve Caratteri(UBound(Caratteri) + 1) Else Exit For End If Next Parziale = "" For Y = UBound(Caratteri) - 1 To 1 Step -1 Parziale = Parziale & Caratteri(Y) Next Parziale = Replace(Parziale, ".doc", "") SoloNomeWord = Parziale End Function Protected Sub Step1_Button_Procedi_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Step1_Button_Procedi.Click If Me.Step1_ListBox.SelectedItem Is Nothing Then Me.Step1_Label_Msg.Visible = True Me.Step1_Label_Msg.Text = "!! Selezionare un documento Word !!" Else NomeConEstensione = Step1_ListBox.SelectedItem.ToString & ".doc" Me.Step1_Label_Msg.Visible = False CaricaSommario() End If End Sub Public Sub CaricaSommario() strSQL = "SELECT * FROM [Sommario]" Me.Step3_GridWord.ShowHeader = True Me.Step3_GridWord.Visible = True Me.Step3_Button_Indietro.Visible = True Try Dim ConnExcel As New OleDbConnection(StringaConnessione) Dim query As OleDbDataAdapter = New OleDbDataAdapter(strSQL, ConnExcel) Dim querydataset As New DataSet() query.Fill(querydataset, 0) Me.Step3_GridWord.DataSource = querydataset.Tables(0).DefaultView Me.Step3_GridWord.DataBind() ConnExcel.Close() Catch ex As System.Data.OleDb.OleDbException Me.Step3_GridWord.Visible = False Me.Step3_Button_Indietro.Visible = False Me.Step3_Label_Msg.Visible = True Me.Step3_Label_Msg.Text = "!! !!" End Try End Sub Protected Sub Step3_Button_Indietro_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Step3_Button_Indietro.Click Me.Step1_ListBox.ClearSelection() Me.Step3_GridWord.Visible = False Me.Step3_Button_Indietro.Visible = False Me.Step3_Label_Msg.Visible = False End Sub End Class

sabato 6 luglio 2013 Pag. 151 / 151

Potrebbero piacerti anche