tutorial pratico - creare un sito asp net 2.pdf

151
S VILUPPARE UN SITO WEB ASP.NET Tutorial pratico Domenico De Cerbo 2008/2009 [email protected] I contenuti del presente Tutorial possono essere utilizzati liberamente, con l’obbligo della citazione dell’autore

Upload: vincenzo-ostoni

Post on 01-Jan-2016

271 views

Category:

Documents


12 download

DESCRIPTION

bhhh

TRANSCRIPT

Page 1: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B AS P . N E T

T u t o r i a l p r a t i c o

Domenico De Cerbo – 2008/2009

[email protected]

I contenuti del presente Tutorial possono essere utilizzati liberamente, con l’obbligo della citazione dell’autore

Page 2: Tutorial pratico - Creare un sito Asp Net 2.pdf

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://css.html.it/

http://aspnet.html.it/

http://www.web-link.it/

http://www.morpheusweb.it/html/manuali/xhtml.asp

http://www.morpheusweb.it/html/manuali/css.asp

http://www.webmasterpoint.org/webdesign/css/home.asp

Per quanto riguarda le tecnologie ASP.Net le fonti principali ed al contempo più attendibili (cui per

l’Appendice 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/

Sull’installazione 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 l’ordine 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 dell’interazione 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.

Page 3: Tutorial pratico - Creare un sito Asp Net 2.pdf

SOMMARIO

SOMMARIO ....................................................................................................................... 3

INTRODUZIONE .................................................................................................................. 7

SVILUPPO ......................................................................................................................... 7

1. CREAZIONE DI UN SITO DENOMINATO SITOPROVE IN VISUAL WEB 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

1. AREA PUBBLICA ....................................................................................................... 24 Default.aspx: la home page ............................................................................................. 24

2. AREA AMMINISTRATORE .............................................................................................. 26 amministra.aspx: la home page dell’area amministrazione ........................................................ 26

Menu di navigazione ................................................................................................................ 26 Controllo Calendario ................................................................................................................ 28 Prospetto Iscritti abilitati all’accesso ............................................................................................. 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

Page 4: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 4 / 151

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

Page 5: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 5 / 151

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

Page 6: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 6 / 151

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

Page 7: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 7 / 151

INTRODUZIONE

L’obiettivo 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 un’esigenza specifica, e quindi si trovano a dover risolvere problema per problema con affannose ricerche, attraverso le quali il più delle volte ottengono risultati abbastanza criptici per lo sviluppatore neofita od occasionale.

Pertanto l’approccio è essenzialmente pratico: nel contesto vengono spiegati sommariamente, ma [spero] in modo abbastanza chiarificatore i singoli passi, mentre per gli approfondimenti si rimanda all’Appendice o a link su Internet.

SVILUPPO

1. CREAZIONE DI UN SITO DENOMINATO SITOPROVE IN VISUAL WEB DEVELOPER (VWD)

DI VISUAL STUDIO 2008 EXPRESS EDITION

OPERAZIONE PRELIMINARE: PROGETTAZIONE DEL SITO

Prevediamo per (quasi) tutte le pagine del sito un layout simile al seguente:

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 all’Amministratore di sistema, amministra.aspx, autorizzazioni.aspx e

pannello.aspx, nella cartella /admin

Page 8: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 8 / 151

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 dell’Amministratore avranno layout specifici, pur in linea di massima rispondenti a quello dello schema di cui sopra; tutte le pagine dell’area degli 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 dell’ambiente 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.

Page 9: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 9 / 151

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 all’impostazione 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 l’accesso 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.

Page 10: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 10 / 151

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 all’interno 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.

L’id, 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. Nel codice modifichiamo il nome del form, sostituendo

<form id="form1" runat="server"> con <form id="pag_iniziale" runat="server">

4. 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:

Page 11: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 11 / 151

2. CONFIGURAZIONE DELLA APPLICAZIONE ASP.NET SITOPROVE 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. Chiudiamo VWD dopo aver salvato la pagina Default.aspx modificata.

2. 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.

3. 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:

Page 12: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 12 / 151

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 l’accesso 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 dell’operazione, dopo aver dato l’OK, 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:

Page 13: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 13 / 151

7. È ora possibile fare il test di accesso. Chiudiamo IIS e VWD, apriamo il browser ed inseriamo l’indirizzo

http://localhost/: appare la prima pagina del sito, che prima era accessibile soltanto da VWD:

3. IMPOSTARE 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 per contenere le pagine riservate all’amministratore di sistema

/mdb-database 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)

/cgi-bin per i file assembly

/private per contenere le cartelle e le pagine riservate agli utenti registrati

/servizi per i file di documento (es. Word, Excel) e le immagini generiche di

supporto

/servizi/img per le immagini descrittive dei contenuti

Attenzione: le specifiche delle cartelle di sistema potrebbero variare in relazione all’hosting 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 pannello aspx, autorizzazioni.aspx

in private iscritti_home.aspx, Pag1.aspx, Pag2.aspx, Pag3.aspx, Pag4.aspx,

Pag5.aspx, PagExcel.aspx, PagWord.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.

Page 14: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 14 / 151

4. IMPOSTAZIONE DELLA SICUREZZA

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 dell’amministratore 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 dall’hosting 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 l’applicazione 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 l’installazione si troverà un file denominato

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:

Page 15: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 15 / 151

Viene così creato un nuovo progetto con tutti i file necessari per costruire, configurare ed avviare

un’applicazione con i provider di Access. La finestra Solution Explorer appare così:

3. Il passo successivo da effettuare è quello di dare un nuovo nome all’assembly 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 l’Assembly 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

Page 16: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 16 / 151

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 all’interno 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 all’avvio dell’applicazione:

<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, all’inizio, la stringa di connessione (notare l’utilizzo della

tilde (~/) nel link: vedere in proposito l’Appendice a pag.60), da:

<add name="AccessFileName" connectionString="~/App-Data/ASPNetDB.mdb"

providerName="System.Data.OleDb"/>

a:

<add name="AccessFileName" connectionString="~/mdb-

database/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 l’interfaccia 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):

Page 17: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 17 / 151

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 l’implementazione 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 l’interfaccia di Microsoft Access, e dall’interno di questo programma apriamo SitoProve\mdb-database\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 all’interno di SitoProve, in modo che nel caso che inavvertitamente dovessimo fare qualche danno possiamo sempre sostituirlo con l’originale 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:

Page 18: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 18 / 151

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 dell’utente

UserName l’account nella tabella aspnet_Users

Password nella tabella aspnet_Membership

Email nella tabella aspnet_Membership

PasswordQuestion nella tabella aspnet_Membership

PasswordAnswer nella tabella aspnet_Membership

IsApproved abilitazione all’accesso nella tabella aspnet_Membership

RoleId numero univoco (campo contatore) generato in aspnet_Roles ed

utilizzato in aspnet_UsersInRoles

per correlare i dati dell’utente

RoleName definizione del nome del ruolo nella tabella aspnet_ Roles

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:

Nome campo Tipo dati Dimensione / formato

Richiesto Indicizzato

UserID numerico Intero lungo

Si Si (chiave)

NomeCompleto Testo 50 No No

nazione Testo 15 No No

cap Testo 7 No No

città Testo 20 No No

provincia Testo 20 No No

indirizzo Testo 100 No No

telcasa Testo 30 No No

telufficio Testo 30 No No

fax Testo 30 No No

cellulare Testo 30 No No

sitoweb Testo 250 No No

Al termine dell’inserimento salviamo la tabella e chiudiamola.

2. Apriamo la finestra Relazioni, facciamo click al suo interno con il tasto destro scegliendo Mostra Tabella; dall’elenco che si apre, selezioniamo la nostra nuova tabella e clicchiamo su Aggiungi: la tabella apparirà all’interno 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_Users e

aspnet_UsersInRoles: lasciamo le relazioni preimpostate

Page 19: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 19 / 151

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_Membership includi tutti i record di aspnet_Users e solo i

record di aspnet_Membership in cui i campi collegati sono uguali

aspnet_Users - DatiAggiunti includi tutti i record di aspnet_Users e solo i

record di DatiAggiunti in cui i campi collegati sono uguali

aspnet_Users - RuoliIscritti includi tutti i record di aspnet_Users e solo i

record di RuoliIscritti in cui i campi collegati sono uguali

Page 20: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 20 / 151

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 nell’applicazione 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).

Page 21: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 21 / 151

Tale premessa comporta che se vogliamo che gli utenti che appartengono ad un ruolo superiore partecipino

alle prerogative del ruolo inferiore, dobbiamo tenerne conto nell’attribuzione 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 l’interfaccia di Strumento di Amministrazione sito WEB (WSAT): facciamo click sul tab Sicurezza, e poi sul link Crea o gestisci ruoli.

2. 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 l’applicazione ha due ruoli, Amministratori e Iscritti, come mostrato nella finestra.

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

Page 22: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 22 / 151

4. Facendo click sul pulsante Crea utente l’immissione 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 pwd e-mail Attivo

Cervantes Cervan14 [email protected]

Domenico Dom2 [email protected]

Hugo Hugo15 [email protected]

Mascagni Masc3 [email protected]

Morante Moran13 [email protected]

Moravia Morav12 [email protected]

Musil Mus4 [email protected]

Prokofiev Proko6 [email protected]

Puccini Pucci7 [email protected]

Vivaldi Vival10 [email protected]

Wagner Wagn11 [email protected]

Page 23: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 23 / 151

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 l’accesso a tutti sulla pagina iniziale, Default.aspx

concedere l’accesso ai soli Amministratori ai contenuti della cartella admin concedere l’accesso 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 dall’interfaccia 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 l’accesso a tutti gli utenti, anche anonimi (“?”)

web.config della cartella /private

<authorization>

<allow roles="Amministratori" />

<allow roles="Iscritti" />

<deny users="?" />

</authorization>

Consente l’accesso 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 l’accesso 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.

Page 24: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 24 / 151

1. AREA PUBBLICA

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 l’accesso alle aree Iscritti ed Amministratore.

1. dal tab Casella degli strumenti trasciniamo all’interno 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 controllo così com’è potrebbe funzionare soltanto impostando la proprietà 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

4. fra le proprietà del controllo specifichiamo OnLoggingIn="OnLoggingIn", che indica il codice

che dovrà essere eseguito se l’autenticazione 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 dell’utente che si è connesso: se appartiene al ruolo degli Amministratori, apre la home page dell’amministratore, se appartiene al ruolo Iscritti apre la home page dell’area iscritti.

6. infine prevediamo l’ipotesi che l’utente non riesca ad accreditarsi (ha dimenticato la password etc.): allora inseriamo un controllo HyperLink con cui diamo possibilità all’utente

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 l’altro è 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 l’utente invii una e-mail al Webmaster, il quale dovrà creare per l’utente stesso una nuova password, ed inviargliela per e-mail. L’utente 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.

Page 25: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 25 / 151

E questo è il risultato nel browser (che si ottiene cliccando sull’icona che appare sulla barra degli

strumenti di VWD):

Page 26: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 26 / 151

2. AREA AMMINISTRATORE

AMMINISTRA.ASPX: LA HOME PAGE DELL’AREA AMMINISTRAZIONE

Questa pagina ha funzioni esclusivamente informative, la gestione dei dati degli iscritti, attività fondamentale di un webmaster, è demandata alle altre pagine dell’Area. È molto simile nell’aspetto 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 nell’interfaccia 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 nell’altra amministra.aspx.

Ora, con il copia/incolla, sostituiamo tutto il codice della seconda con quello della prima; modifichiamo subito l’id 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 dell’area inferiore sull’area superiore), e quindi procediamo alle modifiche:

1. Cancelliamo tutto il contenuto all’interno 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 dell’amministratore 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 all’interno dello stesso <div> inseriamo un piccolo controllo LoginStatus, che consente

all’utente in linea di fare il logout.

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 all’interno 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

Il controllo TreeView fornisce l’interfaccia a dati che vengono raccolti da un controllo

SiteMapDataSource dall’origine dei dati; quest’ultima è un file XLM, che nel caso di menu in

genere è il web.sitemap. Questo file, che occorre elaborare in base a regole sintattiche definite, si

Page 27: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 27 / 151

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 sull’icona (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à all’utente

connesso (in questo caso all’amministratore) 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.

Page 28: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 28 / 151

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 all’interno del tag <asp:Calendar, direttamente o tramite il pannello

Proprietà di VWD, aggiungiamo la proprietà SelectionMode="Day". In tal modo l’utente 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

dell’evento 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 l’inserimento 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 l’utilizzo 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 dall’ambiente di sviluppo a quello di produzione; tale compito viene assunto da MapPath, che partendo dal percorso relativo all’interno 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

Page 29: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 29 / 151

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, nell’ordine, le seguenti operazioni:

Nella prima riga si crea l’istanza ConnIscritti dell’oggetto OleDbConnection, che occorre

popolare con i dati

Nella terza riga si definisce una stringa di testo con un’istruzione 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 all’istanza della connessione la stringa risultante dalla funzione precedente

Con la quinta riga si imposta all’istruzione 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 l’estrazione dei dati, che vengono restituiti dalla query con il metodo sqlIscritti.ExecuteScalar() (Appendice pag.65) sotto forma di oggetto, e con l’istruzione

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, all’interno 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 nell’ultima 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.

Page 30: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 30 / 151

Prospetto Iscritti abilitati all’accesso

16. Sempre nella pagina amministra.aspx posizioniamo il cursore subito dopo l’ultimo Literal che

abbiamo creato in precedenza, ed apriamo la sezione Dati della barra degli strumenti.

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 l’id, per facilitarne l’identificazione, in ID="AccessDS_HomeAdmin"

b ) all’interno 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.

datafile="~/mdb-

database/ASPNetDB.mdb"> connette al database di origine

SelectCommand="SELECT UserId,

NomeCompleto, CreateDate, IsApproved

FROM [SpecIscritti] WHERE IsApproved

= true ORDER BY NomeCompleto"

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).

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 l’id in ID="GridView_HomeAdmin"

e ) all’interno dei tag del controllo impostiamo le seguenti proprietà:

DataSourceID="AccessDS_HomeAdmin" Imposta il riferimento all’id del gestore dell’accesso ai dati, AccessDataSource

EmptyDataText="nessun iscritto" Definisce una stringa che viene mostrata a video qualora nell’origine non vi siano dati

AutoGenerateColumns="false" Posto su false, impedisce che i campi siano generati

automaticamente e ne consente quindi l’impostazione personalizzata (attaverso il passaggio Modifica colonne… descritto sotto)

AllowPaging="True" 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.

AllowSorting="True" Consente di ordinare, cliccando sul titolo, in ordine crescente o descescente le colonne a cui sia impostata la proprietà SortExpression

f ) Passiamo in visualizzazione Progettazione. Cliccando sulla freccetta in alto a destra del controllo

GridView appare un menu contestuale che ci consente l’impostazione guidata dei parametri

necessari:

g ) Selezionare un’origine dati: nella casella a discesa è già selezionato l’AccessDataSource

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 dataiscrizione IsApproved

HaederText (intestazione

colonna)

Iscritti Data di Iscrizione Abil.

ReadOnly true true true

DataFormatString {0:d}

Page 31: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 31 / 151

SortExpression NomeCompleto dataiscrizione IsApproved

i ) Formattazione automatica: scegliamo quella che preferiamo, poi dalle Proprietà del controllo potremo comunque modificare l’aspetto degli elementi.

j ) Fin qui abbiamo implementato la Web Form in modo che nella griglia mostri soltanto gli iscritti abilitati all’accesso, in quanto questa pagina è fondamentalmente una pagina di visualizzazione per una panoramica veloce, gli interventi dell’amministratore verranno svolti nelle 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 all’avvio sia attivo il primo View, e poi abbiamo dato a questi

ID descrittivi, che ci agevolano nella lettura del codice.

l ) Spostiamo tutti i tag dei controlli AccessDataSource e GridView all’interno del primo

controllo View (a). Qui non dobbiamo fare nessuna modifica.

m ) Copiamo tutto il contenuto del primo View nel secondo (b). L’operazione 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 l’ID 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 l’ID in ID="GridView_Tutti" ed il collegamento all’origine dei

dati in DataSourceID="DataSourceTutti"

Tutto il resto rimane invariato.

n ) Ora occorre impostare l’interfaccia 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 dell’utente, 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 l’evento click, OnCheckedChanged="radioAbilitati_Click".

Page 32: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 32 / 151

o ) Completata l’interfaccia, 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 l’avvio 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 l’altra.

r ) Interveniamo nelle proprietà dei vari controlli e del CSS per migliorare alcuni aspetti estetici (colori, font, spaziature etc.), dopodichè l’output a schermo della pagina completa sarà il seguente:

Page 33: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 33 / 151

Abbiamo così terminato la pagina introduttiva dell’amministratore di sistema.

Page 34: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 34 / 151

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 l’integrità 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 l’amministratore 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 l’Appendice 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;

2. copiamo l’intera sezione <div id="footer">.

3. copiamo l’impostazione del <div id="principale_largo">, senza i contenuti. In questa sezione

faremo tutte le operazioni che seguono.

4. All’inizio 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:

Passiamo quindi al primo punto: l’inserimento delle informazioni di base, quelle cioè che sono

memorizzate nelle tabelle predefinite del database. Ciascuno dei passaggi che seguono sarà inserito all’interno 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 l’inserimento 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):

Page 35: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 35 / 151

Account <asp:TextBox Casella di testo che valorizza il campo

UseName della tabella aspnet_Users

Password <asp:TextBox Casella di testo che valorizza il campo

password della tabella aspnet_Membership

Conferma Password <asp:TextBox Casella di testo che ha l’unica funzione di

verificare la password immessa nella casella pracedente

E-mail <asp:TextBox Casella di testo che valorizza il campo

email della tabella aspnet_Membership

Domanda di sicurezza <asp:DropDownList Elenco a

scomparsa che prevede alcune opzioni fra cui scegliere quella che valorizza il campo PasswordQuestion della tabella aspnet_Membership

Risposta <asp:TextBox Casella di testo che valorizza il campo

PasswordAnswer della tabella aspnet_Membership

Abilitato? <asp:RadioButtonList 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 l’immissione dei dati nel database: <asp:Button ID="CreateUser" OnClick="CreateUser_OnClick" runat="server"

Text="Registra l'Iscritto" />

Prima di avviare il salvataggio dei dati nel database, però, è necessario verificare che:

a ) il nome di accont immesso non sia già stato utilizzato

b ) tutte le caselle siano state compilate

c ) 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 l’Appendice 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 l’account:

Page 36: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 36 / 151

<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-z0-

9]{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 l’oggetto MembershipUser = Membership.CreateUser, crea

nel database il nuovo utente scrivendo nelle tabelle appropriate i dati immessi nella pagina web. Alla fine svolge un’ulteriore verifica che l’utente 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 l’utente è stato creato.

8. La procedura, inoltre, richiamando la procedura Sub ID_aDatiAggiunti, che a sua volta

richiama Function VerificaID, aggiunge l’UserId dell’utente 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: l’attribuzione ad un ruolo dell’utente appena creato. Per questo compito ci occorrono un TextBox ed una DropDownList,

quest’ultima associata ad un AccessDataSource, per definire il ruolo da attribuire e l’iscritto

cui attribuirlo, ed un bottone di comando per avviare l’attribuzione.

2. il TextBox viene valorizzato con l’account dell’utente 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 dell’utente

Page 37: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 37 / 151

attribuisce il ruolo all’utente 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="~/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>

la cui funzione è quella di mettere a disposizione di controlli per la visualizzazione e l’editing 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 l’editing, inseriamo un controllo DetailsView, che ha la caratteristica di mostrare una colonna con tutti i campi del record

che interessa: avendo impostato l’ordine discendente sul campo chiave UserId verrà

visualizzato l’ultimo utente prima dell’inserimento del nuovo, vedremo in seguito come aggiornare la vista. L’impostazione delle principali proprietà del controllo dovrà essere il seguente:

ID="Details_Nuovi" dà un id univoco e descrittivo

DataSourceID="GridSource" Imposta il collegamento all’AccessDataSource

inserito in precedenza come fonte dei dati

DataKeyNames="UserId" Imposta il nome del campo di chiave primaria della tabella di origine

AutoGenerateRows="False" 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 dell’ultimo 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:

Page 38: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 38 / 151

Campi del database

Tipo Campo Nome Campo

(DataField)

Intestazione Colonna

(HaederText)

Note Da trasformare in TemplateField

BoundField UserId ID Nr. ReadOnly

BoundField NomeCompleto Cognome e Nome si

BoundField nazione Nazione

BoundField cap C.A.P. si

BoundField città Città

BoundField provincia Provincia

BoundField indirizzo Indirizzo

BoundField telcasa Tel.Casa si

BoundField telufficio Tel.Ufficio si

BoundField fax Fax si

BoundField cellulare Cellulare si

BoundField sitoweb Sito Web 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 l’accesso 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 c’era anche la 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

nell’ItemTemplate, può solo leggere un valore) c ) Sulle validazioni specificate torneremo a breve

Page 39: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 39 / 151

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 dell’iscritto).

All’apertura 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 Verifiche necessarie Controlli da utilizzare

NomeCompleto

Non può essere vuoto RequiredFieldValidator

cap Può essere lasciato vuoto, ma se valorizzato deve avere cinque caratteri numerici

RegularExpressionValidator

telcasa Tel. Casa: Può essere lasciato vuoto, ma se inserito deve avere 8 caratteri numerici, di cui il primo deve essere 0

RegularExpressionValidator

telufficio Può essere lasciato vuoto, ma se valorizzato deve avere almeno 5 caratteri numerici, di cui il primo deve essere 0

RegularExpressionValidator

cellulare Può essere lasciato vuoto, ma se valorizzato deve avere almeno 8 caratteri numerici, di cui il primo deve essere 3

RegularExpressionValidator

sitoweb Può essere lasciato vuoto, ma se valorizzato deve iniziare con http:// o con http://www.

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 è l’aggiornamento run time della DetailsView: infatti questa viene popolata al caricamento della pagina, quindi non comprende ancora l’utente che abbiamo immesso al primo passaggio della registrazione, che invece è proprio quello che ci serve.

Page 40: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 40 / 151

7. Il momento in cui fare l’aggiornamento è quello immediatamente successivo alla

registrazione dei dati di base ad all’aggiunta alla tabella DatiAggiunti del record con l’ID 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 solo comando, 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

all’attribuzione di un ruolo ad un utente (DataSourceID="Access_RuoliEsistenti"). Nella

costruzione del controllo inseriamo anche un pulsante Seleziona, che ci servirà per l’eliminazione.

2. Quindi inseriamo una casella di testo, con un’etichetta 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" Font-

Names="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 l’eliminazione. Inseriamo sotto la GridView un 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 un’eccezione e non cancella il ruolo se questo è attribuito a qualche utente. Se invece il ruolo è orfano e quindi può essere cancellato, l’elimina senza avvisi: per tal motivo abbiamo previsto un codice client javascript che mostra una finestra modale di Windows per confermare o annullare l’azione. 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:

Page 41: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 41 / 151

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. Copiamo tutto il codice di autorizzazioni.aspx in pannello.aspx

2. Eliminiamo tutto il contenuto all’interno di <div id="principale_largo">, al cui interno, sempre

attraverso <div, creiamo i box sovrapposti, ciascuno per una delle sezioni della pagina, ed all’interno

del primo box due box affiancati: quello di sinistra per la GridView di visualizzazione, quello di destra

per la DetailsView di gestione.

3. Inseriamo quindi l’intestazione 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 un’unica 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 dell’iscritto, per la visualizzazione e l’intervento 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" dà un id univoco e descrittivo

datasourcemode="DataSet" Consente la modifica dei dati

datafile="~/mdb-database/ASPNetDB.mdb"> connette al database di origine

SelectCommand="SELECT *FROM

[SpecIscritti]> 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

Page 42: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 42 / 151

2. Inseriamo un controllo GridView cui attribuiamo l’ID="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)

Intestazione Colonna

(HaederText)

Formato

(DataFormat String)

Note

BoundField UserId Nr. ReadOnly

BoundField NomeCompleto Iscritto ReadOnly

CheckBoxField IsApproved IsApproved?

BoundField UserName Account ReadOnly

BoundField dataiscrizione Data di Iscrizione {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 l’origine dati di questo controllo alla stessa origine della GridView o ad un’origine autonoma.

La prima soluzione sarebbe quella più semplice: basterebbe mettere come DataSourceID della Details

l’ID 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 l’eliminazione degli utenti 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" dà un id univoco e descrittivo

datasourcemode="DataSet" Consente la modifica dei dati

datafile="~/mdb-database/ASPNetDB.mdb"> connette al database di origine

SelectCommand="SELECT * FROM [SpecIscritti] WHERE

[UserId] = @UserId" 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.

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" >

Imposta l’ambito di applicazione del comando Update (modifica record)

Nella definizione delle istruzioni Command sopra riportate applichiamo i parametri, che sono

controlli che consentono di impostare l’origine di alcune informazioni dall’esterno del controllo che li

Page 43: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 43 / 151

richiama. Quindi all’interno 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. All’interno 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

l’istruzione WHERE [UserId] = @UserId, l’ID 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 all’interno della

GridView risulta selezionato (PropertyName="SelectedValue").

3. Gli altri Command, poiché operano all’interno dello stesso controllo da cui devono prelevare le informazioni (DetailsView, per l’inserimento 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 nell’InsertCommand non abbiamo definito i parametri per i campi che non

prevediamo di aggiornare tramite il pannello (UserId, RoleName, CreateDate).

4. Inseriamo un controllo DetailsView (Appendice pag.90); nelle Proprietà impostiamo su

false AutoGenerateRows, e – in visualizzazione Progettazione, facendo click sulla piccola

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)

Intestazione Colonna

(HaederText)

Formato

(DataFormat String)

Note

BoundField UserId ID Nr. ReadOnly

BoundField UserName Account

BoundField NomeCompleto Cognome e Nome

BoundField RoleName Ruolo ReadOnly

CheckBoxField IsApproved IsApproved?

BoundField CreateDate Data di

Iscrizione

{0:d} ReadOnly - Formato data breve

BoundField LastLoginDate Ultimo accesso {0:d} ReadOnly - Formato data breve

BoundField PasswordQuestion Domanda di

Sicurezza

BoundField PasswordAnswer Risposta

BoundField email e-mail

BoundField nazione Nazione

BoundField cap C.A.P.

BoundField città Città

BoundField provincia Provincia

BoundField indirizzo Indirizzo

BoundField telcasa Tel. Casa

BoundField telufficio Tel. Ufficio

BoundField fax Fax

BoundField cellulare Cellulare

BoundField sitoweb Sito Web

Page 44: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 44 / 151

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 l’accesso 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 l’interfaccia inserendo l’ultimo 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 dell’Iscritto 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 dell’Iscritto 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 l’origine 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 all’interno dei tag dei controllo stessi; pertanto dovremo inserire:

in GridView: OnSelectedIndexChanged="GridView_Pannello_SelectedIndexChanged"

in DetailsView: OnModeChanged="Details_Pannello_ModeChanged"

Page 45: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 45 / 151

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

l’accesso 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 Intestaz. Verifiche necessarie Controlli da utilizzare

NomeCompleto Iscritto Non può essere vuoto RequiredFieldValidator

UserName Account Non può essere vuoto

Deve avere tra 6 e 12 caratteri alfabetici

RequiredFieldValidator

RegularExpressionValidator

email e-mail Può essere lasciato

vuoto, ma se valorizzato deve avere un formato e-mail valido

RegularExpressionValidator

nazione Nazione

cap C.A.P. Può essere lasciato

vuoto, ma se valorizzato deve avere cinque caratteri numerici

RegularExpressionValidator

telcasa Tel. Casa Tel. Casa: Può essere

lasciato vuoto, ma se inserito deve avere 8 caratteri numerici, di cui il primo deve essere 0

RegularExpressionValidator

telufficio Tel. Ufficio Può essere lasciato

vuoto, ma se valorizzato deve avere almeno 5 caratteri numerici, di cui il primo deve essere 0

RegularExpressionValidator

cellulare Cellulare Può essere lasciato

vuoto, ma se valorizzato deve avere almeno 8 caratteri numerici, di cui il primo deve essere 3

RegularExpressionValidator

sitoweb Sito Web Può essere lasciato

vuoto, ma se valorizzato deve iniziare con http:// o con http://www.

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>

Page 46: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 46 / 151

<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 all’interno 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 nell’ItemTemplate, può solo leggere un valore.

2. Prima di inserire i controlli per la validazione delle immissioni, occorre prendere un’altra 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 l’etichetta 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, all’interno dell’ItemTemplate (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-zA-

Z]{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 l’approfondimento.

Sezione Eliminazione Utenti

1. Qui ci servono: una DropDownList da cui selezionare l’utente da eliminare, un TextBox in cui

venga evidenziato l’utente selezionato ed un pulsante di comando per avviare l’eliminazione.

2. In primo luogo nel database ci creiamo una query, che chiamiamo IscrittiIdAccount, che per ogni utente recuperi solo l’Id ed il nome dell’account, 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 dell’account da eliminare:

<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"

Page 47: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 47 / 151

DataTextField="UserName" DataValueField="UserName" Width="100px"

AutoPostBack="True">

</asp:DropDownList>

4. inseriamo una casella di testo che mostra il nome dell’account 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 dell’eliminazione dell’utente 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, l’eliminazione 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 utilizza un comando OleDbCommand

mediante una stringa sql DELETE FROM

Sezione Modifica assegnazione ruoli

1. per l’attribuzione 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

l’assegnazione applicando il metodo Roles.AddUserToRole.

2. per eliminare l’attribuzione 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

quell’utente, attraverso la procedura ListaUtentiRuoli_SelectedIndexChanged, ed alla fine

premendo il pulsante si elimina l’assegnazione 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.

Page 48: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 48 / 151

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

Page 49: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 49 / 151

A questo punto abbiamo terminato l’Area Amministratore, e passiamo alle pagine riservate agli Iscritti.

Page 50: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 50 / 151

3. AREA ISCRITTI

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:

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

Intestazione del sito

Menu di navigazione

Pie’ di pagina

Intestazione del sito

Menu di navigazione

Pie’ di pagina

Area corrente

Area corrente

Page 51: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 51 / 151

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 l’unica 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 all’area Iscritti, perché di fatto molte delle impostazioni di layout si ripetono in tutta l’applicazione; abbiamo però preferito, per motivi didattici (chiarezza espositiva e di lettura del codice) non introdurre prima il concetto, soprattutto quando c’erano da sviluppare pagine più complesse. Comunque, una volta capito il meccanismo, non è difficile creare le master per tutto il sito.

CREARE LA PAGINA MASTER

1. 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:

Page 52: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 52 / 151

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 dell’area 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 l’Amministratore, 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. In questo caso utilizziamo WebIscritti.sitemap che abbiamo predisposto in quell’occasione.

2. Il menu è uguale per tutta l’Area 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 anch’esso 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:

Page 53: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 53 / 151

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. All’interno 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 nell’ambiente 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:

Page 54: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 54 / 151

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 l’area 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 all’interno di pagine Web abbiamo tre possibilità:

A ) Salvare il documento, dall’interno di Excel, come pagina 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, dall’interno 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 l’impossibilità di eliminare righe intere.

Comunque in rete si trovano tools che, attraverso l’implementazione 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 l’applicazione: abbiamo messo poche righe con UserID ed UserName di alcuni degli Utenti registrati nel database di Access, aggiungendo il campo e-mail

Page 55: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 55 / 151

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 nell’ambiente 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" Font-

Underline="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:

Page 56: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 56 / 151

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 l’interfaccia 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. l’elenco dei documenti Excel disponibili nel sito viene caricato, all’apertura 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 l’oggetto 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. l’ambito dei dati da estrarre di definisce attraverso stringhe SQL, che richiamano intervalli di celle mediante riferimenti o nomi:

strSQL = "SELECT * FROM GruppoUtenti"

strSQL = "SELECT * FROM " & QuoteUtente

strSQL = "SELECT * FROM [Foglio1$C1:C5]"

strSQL = "SELECT * FROM [Foglio1$C1:D5]"

strSQL = "SELECT * FROM [Foglio1$C2:D3]"

Page 57: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 57 / 151

7. l’estrazione 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 imposta una variabile oggetto su una nuova istanza di OleDbConnection

query imposta una variabile oggetto su una nuova istanza di

OleDbDataAdapter, che definisce la specifica connessione con il

gruppo di dati da richiamare

querydataset imposta una variabile oggetto su una nuova istanza di DataSet,

che riserva in memoria lo spazio per i dati

query.Fill riempie querydataset con i dati estratti

Le righe successive impostano l’origine dei dati della GridView sul querydataset e

ne effettuano il databinding.

8. vediamo la GridView di uno degli output:

Page 58: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 58 / 151

9. e la pagina completa con un altro output:

COLLEGAMENTI A DOCUMENTI WORD

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 l’intero 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 l’esempio 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.

Page 59: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 59 / 151

Questo è il risultato a schermo:

CONCLUSIONE

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 quant’altro), che senz’altro saranno utili anche a me, in quanto anch’io faccio parte del target di utilizzatori cui mi rivolgo: sviluppatori occasionali ed amatoriali.

Page 60: Tutorial pratico - Creare un sito Asp Net 2.pdf

APPENDICI DI R IFERIMENTO

I FILE *.CONFIG

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 dell’applicazione 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 l’elemento sintattico ../ (../ risale

di un livello, ../../ risale di due livelli, ../../../ risale

di tre livelli, e così via), seguito dal nome della risorsa; nell’esempio 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: nell’esempio precedente, la chiamata

dovrebbe essere src="~/servizi/img/logo.jpg".

Page 61: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 61 / 151

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

Page 62: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 62 / 151

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 l’oggetto 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.), dall’oggetto 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;"

Page 63: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 63 / 151

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

É l’oggetto 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 stringa vuota ("")

ConnectionTimeout 15

Database stringa vuota ("")

DataSource stringa vuota ("")

Costruttori

Nome Descrizione

OleDbConnection

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 Descrizione

BeginTransaction 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.

Close Chiude la connessione all'origine dati. Il metodo Close esegue il rollback di tutte le transazioni in sospeso.

Page 64: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 64 / 151

Nome Descrizione

CreateCommand Crea e restituisce un oggetto OleDbCommand associato alla classe OleDbConnection.

GetType Ottiene l'oggetto Type dell'istanza corrente.

Open Apre una connessione a un database con le impostazioni delle proprietà specificate dalla proprietà ConnectionString.

Proprietà (più frequenti)

Nome Descrizione

ConnectionString 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.

ConnectionTimeout

Ottiene il tempo di attesa mentre si tenta di stabilire una connessione, prima di terminare il tentativo e generare un errore.

Database Ottiene il nome del database corrente o del database da utilizzare una volta aperta la connessione.

DataSource Ottiene il nome server o il nome file dell'origine dati.

Provider Ottiene il nome del provider OLE DB specificato nella clausola "Provider= " della stringa di connessione.

State Ottiene lo stato corrente della connessione.

Dim instance As OleDbConnection

Dim value As ConnectionState

value = instance.State

Eventi

Nome Descrizione

Disposed Si verifica quando il componente viene eliminato da una chiamata al metodo Dispose. (Ereditato da

Component)

InfoMessage 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.

Implementazioni esplicite dell'interfaccia

Nome Descrizione

BeginTransaction

Sottoposto a overload.

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

CreateCommand Sottoposto a overload.

Page 65: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 65 / 151

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 all’indirizzo 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.

ExecuteNonQuery 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.

ExecuteScalar 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.

Costruttori

Nome Descrizione

OleDbCommand 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 Descrizione

Cancel 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.

Clone Crea un nuovo oggetto OleDbCommand che è una copia dell'istanza corrente.

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 Esegue un'istruzione SQL nella proprietà Connection e restituisce il numero di righe modificate.

(Esegue l'override di DbCommand.ExecuteNonQuery()).

ExecuteReader Sottoposto a overload. Invia la proprietà CommandText alla proprietà Connection e genera un

oggetto OleDbDataReader.

Page 66: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 66 / 151

Nome Descrizione

ExecuteScalar 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 Descrizione

CommandText 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.

CommandTimeout

Ottiene o imposta il tempo di attesa prima di terminare il tentativo di eseguire un comando e generare un errore.

CommandType 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)

Page 67: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 67 / 151

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

Page 68: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 68 / 151

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 all’interno 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 server-side.

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 @Master (vederne gli attributi in Appendice a pag.60) al posto della direttiva

@Page.

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 (nell’esempio 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 l’effettivo contenuto per uno dei placeholder

definiti nel master. L’associazione tra controllo ContentPlaceHolder e Content avviene sul valore

dell’ID del placeholder. Si veda l’esempio:

sulla pagina Master

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

sulla pagina content

<asp:Content runat=”server” contentplaceholderID=”Body”>

<$VE;>

</asp:Content>

Page 69: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 69 / 151

La pagina content è associata al master tramite l’attributo MasterPageFile definito nella direttiva

@Page. L’attributo contiene il percorso del file master:

<%@ Page Language=”C#” MasterPageFile=”primo.master” %>

Master annidati

Una pagina master può essere a sua volta collegata con un’altra 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”>

Page 70: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 70 / 151

<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.

Page 71: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 71 / 151

HtmlGenericControl classe generica per gli elementi non definiti in ASP.NET.

HtmlImage Elemento HTML <image>

HtmlInputButton Elemento HTML <input type="button">, <input type="submit">, e <input type="reset">

HtmlInputCheckBox Elemento HTML <input type="checkbox">

HtmlInputControl

HtmlInputFile Elemento HTML <input type="file">

HtmlInputHidden Elemento HTML <input type="hidden">

HtmlInputImage Elemento HTML <input type="image">

HtmlInputRadioButton Elemento HTML <input type="radio">

HtmlInputText Elemento HTML <input type="text"> e <input type="password">

HtmlSelect Elemento HTML <select>

HtmlTable

HtmlTableCell

HtmlTableCellCollection

HtmlTableRow Elementi HTML <table>,<td>, <th> e <tr>

HtmlTableRowCollection

HtmlTextArea 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 l’input non supera la validazione, verrà visualizzato un messaggio d’errore all’utente. La sintassi è analoga a quella per i controlli 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.

Page 72: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 72 / 151

<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.

Page 73: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 73 / 151

<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 l’autenticazione 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.

CustomValidator 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 lato-server, 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:

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

Page 74: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 74 / 151

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-p-5.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 <ASP:ValidationSummary> visualizzerà il riepilogo degli errori

contenuti nella pagina.

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

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

EnableClientScript imposta o restituisce un valore booleano che indica se la convalida lato-client

è attiva

Enabled imposta o restituisce un valore booleano che indica se la convalidà verrà

effettuata

ErrorMessage 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.

ForeColor imposta o restituisce il colore con cui verrà visualizzato il messaggio d'errore

nel caso la convalida fallisca

IsValid imposta o restituisce un valore booleano che indica se il valore del comando

di input associato ha passato la convalida

Text 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.

Page 75: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 75 / 151

Espressioni Regolari

Le epressioni iniziano sempre con il simbolo ^ e terminano con il simbolo $

Simboli Esempi validazione Descrizione

^ la corrispondenza deve verificarsi all'inizio della stringa

$ la corrispondenza deve verificarsi al termine della stringa

\G la corrispondenza deve verificarsi nel punto in cui è terminata la corrispondenza precedente

. a.c abc, aac, acc, adc, aec, ...

Qualunque carattere, eccetto a capo

| bill|ted Ted o bill uno qualsiasi dei termini separati dal carattere | (barra verticale)

{n} ab{2}c abbc Corrisponde all'elemento precedente

esattamente n volte

{n,} Corrisponde all'elemento precedente

almeno n volte

{n,m} Corrisponde all'elemento precedente

almeno n volte, ma non più di m volte

[...] a[bB]c

[\p{P}\d]

abc, aBc

specifica tutta la punteggiatura e le cifre decimali

qualsiasi carattere compreso nel gruppo di caratteri specificato

[^...] [^aeiou]

[^\p{P}\d]

specifica tutti i caratteri eccetto la punteggiatura e le cifre decimali

qualsiasi carattere non compreso nel gruppo di caratteri specificato

(...) (abc){2} Abcabc Raggruppamento logico di una parte

dell’espressione

* ab*c ac, abc, abbc, abbbc, ...

Corrisponde all'elemento precedente zero o più volte

+ ab+c abc, abbc, abbbc, ... Corrisponde all'elemento precedente una o più volte

? ab?c ac, abc Corrisponde all'elemento precedente zero o una volta

\ a\sc a c Preceding one of the above, it makes it a literal instead of a special character.

- [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'

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 qualsiasi carattere alfabetico

\W qualsiasi carattere non alfabetico

\s qualsiasi carattere di spazio

\S qualsiasi carattere diverso da uno spazio

\d qualsiasi cifra decimale

\D qualsiasi carattere non numerico

Page 76: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 76 / 151

Simboli Esempi validazione Descrizione

\p{name} Corrisponde a un carattere incluso in un blocco denominato

\P{name} 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

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\-\.]+)@((\[([0-

9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-

Z]{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][0-

9]|3[01])([/])(0[13578]|10|12)([/])(\d{4}))|(([0][1-

9]|[12][0-9]|30)([/])(0[469]|11)([/])(\d{4}))|((0[1-

9]|1[0-9]|2[0-8])([/])(02)([/])(\d{4}))|((29)(\.|-

|\/)(02)([/])([02468][048]00))|((29)([/])(02)([/])([13579

][26]00))|((29)([/])(02)([/])([0-9][0-

9][0][48]))|((29)([/])(02)([/])([0-9][0-

9][2468][048]))|((29)([/])(02)([/])([0-9][0-

9][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

Page 77: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 77 / 151

<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 [email protected]

@ 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 [email protected]

[\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}$/

Page 78: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 78 / 151

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}[0-

9]{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 dell’utente. Dall’interfaccia 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 all’interno 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, l’evento 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.

Page 79: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 79 / 151

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 l’opzione Option Explicit di Visual

Basic. L’attributo è 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 l’opzione Option Strict di Visual

Basic. L’attributo è ignorato se il linguaggio scelto non è Visual Basic.NET. Vale false per default.

Page 80: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 80 / 151

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.

Page 81: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 81 / 151

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,

Page 82: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 82 / 151

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.

Page 83: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 83 / 151

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.

Page 84: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 84 / 151

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 code-behind 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.

Page 85: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 85 / 151

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 un’altra 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

Page 86: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 86 / 151

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 AutoPostBack, se impostata a true, invierà la richiesta al

server quando un evento accade nel controllo.

Ad esempio: se una casella a discesa (DropdownBox) ha la proprietà AutoPostBack impostata su

true, ogni volta che l’utente 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 all’interno dell’HTML generato:

a. una variabile nascosta, denominata __EVENTTARGET

che dice al server quale controllo è interessato all’evento

b. una variabile nascosta, denominata __EVENTARGUMENT

per fornire sull’evento ulteriori informazioni a cui il server deve accedere

c. 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

Page 87: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 87 / 151

gestisce l’evento OnChange dal lato client chiamando l’evento __doPostBack con il

nome del controllo in cui l’evento OnChange si è verificato

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.

Il controllo 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.

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 È possibile selezionare una singola data.

DayWeek È possibile selezionare una singola data o un'intera settimana.

DayWeekMonth È possibile selezionare una singola data, settimana o mese intero.

None 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

Page 88: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 88 / 151

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

disponibili.

Utilizza sempre lo stesso provider, System.Data.OleDb .NET, per questo motivo, la proprietà 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à Requisiti

Ordinamento Impostare la proprietà DataSourceMode sul valore DataSet.

Filtraggio Impostare la proprietà FilterExpression su un'espressione di filtraggio utilizzata per filtrare i

dati quando viene chiamato il metodo Select.

Paging 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.

Aggiornamento

Impostare la proprietà UpdateCommand su un'istruzione SQL utilizzata per aggiornare i

dati. In genere questa istruzione è parametrizzata.

Eliminazione Impostare la proprietà DeleteCommand su un'istruzione SQL utilizzata per eliminare i dati.

In genere questa istruzione è parametrizzata.

Inserimento Impostare la proprietà InsertCommand su un'istruzione SQL utilizzata per inserire i dati. In

genere questa istruzione è parametrizzata.

Cache 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.

I controlli con associazione ai dati vengono associati a una classe AccessDataSource utilizzando la proprietà DataSourceID del controllo con associazione ai dati.

Principali proprietà

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

DataFile Ottiene o imposta la posizione del file mdb di Microsoft Access.

DataSourceMode 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 Ottiene o imposta l'identificatore a livello di programmazione assegnato al controllo server.

SelectCommand Ottiene o imposta la stringa SQL utilizzata dal controllo SqlDataSource per recuperare dati dal database sottostante.

Visible Ottiene o imposta un valore che indica se il controllo è visualizzato.

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.

Page 89: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 89 / 151

<%@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 Descrizione

BoundField Visualizza il valore di un campo in un'origine dati. Si tratta del tipo di colonna predefinito del controllo GridView.

ButtonField 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.

CheckBoxField 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.

CommandField Visualizza pulsanti di comando predefiniti per l'esecuzione di operazioni di selezione, modifica o

Page 90: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 90 / 151

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.

ImageField Visualizza un'immagine per ciascun elemento nel controllo GridView.

TemplateField 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.

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 View fungono da contenitori per altri controlli e tag e consentono di

presentare visualizzazioni alternative.

Il controllo MultiView funge da contenitore esterno per uno o più controlli View, all’interno dei quali

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 all’interno 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.

Page 91: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 91 / 151

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 all’interno di ogni modello, e se incluso il controllo asp:LoginName,

anche il nome dell’utente 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>

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/it-it/library/system.web.ui.webcontrols.templatefield(VS.80).aspx.

CLASSE COMMANDFIELD

La classe CommandField è un campo speciale utilizzato dai controlli con associazione a dati (ad esempio

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.

CLASSE CONTENT

Contiene i controlli di testo, di tag e server per eseguire il rendering di un controllo

ContentPlaceHolder in una pagina master.

CLASSE MENU

Visualizza un menu in una pagina Web ASP.NET.

Page 92: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 92 / 151

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 Descrizione

CreateUser 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.

DeleteUser Sottoposto a overload. Elimina un utente dal database.

FindUsersByEmail 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.

FindUsersByName Sottoposto a overload. Ottiene un insieme degli utenti di appartenenza in cui il nome utente contiene il nome specificato di cui verificare la corrispondenza.

GeneratePassword Genera una password casuale con la lunghezza specificata.

GetAllUsers 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

Page 93: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 93 / 151

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 Ottiene il numero corrente di utenti connessi a un'applicazione.

GetUser Sottoposto a overload. Ottiene le informazioni di un utente di appartenenza dall'origine dati.

GetUserNameByEmail Ottiene il nome di un utente il cui indirizzo di posta elettronica corrisponde all'indirizzo di posta elettronica specificato.

UpdateUser 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.

ValidateUser Verifica che nome utente e password forniti siano validi.

PROPRIETÀ

Nome Descrizione

ApplicationName Ottiene o imposta il nome dell'applicazione.

EnablePasswordReset Ottiene un valore che indica se il provider di appartenenze corrente è configurato in modo da consentire agli utenti di reimpostare le loro password.

EnablePasswordRetrieval Ottiene un valore che indica se il provider di appartenenze corrente è configurato in modo da consentire agli utenti di recuperare le loro password.

HashAlgorithmType Identificatore dell'algoritmo utilizzato per la codifica hash delle password.

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 Ottiene la lunghezza minima di una password.

PasswordAttemptWindow 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.

PasswordStrengthRegularExpression Ottiene l'espressione regolare utilizzata per valutare una password.

Provider Ottiene un riferimento al provider di appartenenze predefinito per l'applicazione.

Providers Ottiene un insieme dei provider di appartenenze per l'applicazione ASP.NET.

RequiresQuestionAndAnswer 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.

UserIsOnlineTimeWindow 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.

Page 94: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 94 / 151

EVENTI

Nome Descrizione

ValidatingPassword 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)

Page 95: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 95 / 151

METODI

Nome Descrizione

ChangePassword 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 Consente di determinare se l'oggetto Object specificato è uguale all'oggetto Object corrente. (Ereditato da Object)

Finalize 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)

GetHashCode Funge da funzione hash per un determinato tipo. (Ereditato da Object)

GetPassword Sottoposto a overload. Ottiene la password dell'utente di appartenenza dall'archivio dati di appartenenze.

GetType Ottiene l'oggetto Type dell'istanza corrente. (Ereditato da Object)

MemberwiseClone Consente di creare una copia dei riferimenti dell'oggetto Object corrente. (Ereditato da Object)

ResetPassword Sottoposto a overload. Consente di impostare per un utente una nuova password generata automaticamente.

ToString Restituisce il nome dell'utente di appartenenza. (Esegue l'override di Object.ToString()).

UnlockUser Annulla lo stato di blocco dell'utente in modo da consentire la convalida dell'utente di appartenenza.

PROPRIETÀ

Nome Descrizione

Comment Ottiene o imposta le informazioni specifiche dell'applicazione relative all'utente di appartenenza.

CreationDate Ottiene data e ora in cui l'utente è stato aggiunto all'archivio dati di appartenenze.

Email Ottiene o imposta l'indirizzo di posta elettronica dell'utente di appartenenza.

IsApproved Ottiene o imposta un valore che indica se è possibile autenticare l'utente di appartenenza.

IsLockedOut Ottiene un valore che indica se l'utente di appartenenza è stato bloccato e quindi non è possibile effettuarne la convalida.

IsOnline Ottiene un valore che indica se l'utente è correntemente in linea.

LastActivityDate 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.

LastLockoutDate Ottiene la data e l'ora dell'ultimo blocco dell'utente di appartenenza.

LastLoginDate 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.

Page 96: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 96 / 151

Nome Descrizione

ProviderName Ottiene il nome del provider di appartenenze in cui sono memorizzate e da cui vengono recuperate le informazioni sugli utenti di appartenenza.

ProviderUserKey Ottiene l'identificatore univoco dell'utente dall'origine dati di appartenenze dell'utente.

UserName 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 Descrizione

Success L'utente è stato creato correttamente.

InvalidUserName Il nome utente non è stato trovato nel database.

InvalidPassword La password non è formattata correttamente.

InvalidQuestion La domanda per la password non è formattata correttamente.

InvalidAnswer La risposta per la password non è formattata correttamente.

InvalidEmail L'indirizzo di posta elettronica non è formattato correttamente.

DuplicateUserName Il nome utente è già presente nel database dell'applicazione.

DuplicateEmail L'indirizzo di posta elettronica è già presente nel database dell'applicazione.

UserRejected L'utente non è stato creato per un motivo definito dal provider.

InvalidProviderUserKey Il tipo o formato della chiave utente del provider non è valido.

DuplicateProviderUserKey La chiave utente del provider è già presente nel database dell'applicazione.

ProviderError 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.

Page 97: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 97 / 151

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

Page 98: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 98 / 151

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."

Page 99: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 99 / 151

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>

Page 100: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 100 / 151

<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 runat="server">

Dim pageSize As Integer = 5

Dim totalUsers As Integer

Dim totalPages As Integer

Dim 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)

Page 101: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 101 / 151

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>

Page 102: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 102 / 151

<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 Descrizione

AddUsersToRole Aggiunge utenti specifici al ruolo specificato.

AddUsersToRoles Aggiunge utenti specifici ai ruoli specificati.

AddUserToRole 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 Condizione

System.ArgumentNullException roleName è riferimento null (Nothing in Visual Basic) -oppure- username è riferimento null (Nothing in Visual Basic).

System.ArgumentException 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

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 Aggiunge l'utente specificato ai ruoli specificati.

CreateRole Aggiunge un nuovo ruolo all'origine dati.

DeleteCookie Elimina il cookie in cui sono memorizzati i nomi di ruoli.

Page 103: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 103 / 151

Nome Descrizione

DeleteRole 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.

FindUsersInRole 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.

GetAllRoles Ottiene un elenco di tutti i ruoli per l'applicazione.

GetRolesForUser Sottoposto a overload. Ottiene un elenco di ruoli a cui appartiene un utente.

GetUsersInRole Ottiene un elenco di utenti appartenenti al ruolo specificato.

IsUserInRole Sottoposto a overload. Ottiene un valore che indica se un utente appartiene al ruolo specificato.

RemoveUserFromRole Rimuove l'utente specificato dal ruolo specificato.

RemoveUserFromRoles Rimuove l'utente specificato dai ruoli specificati.

RemoveUsersFromRole Rimuove gli utenti specificati dal ruolo specificato.

RemoveUsersFromRoles

Consente di rimuovere i nomi utente specificati dai ruoli specificati.

RoleExists Ottiene un valore che indica se il nome del ruolo specificato esiste già nell'origine dati del ruolo.

PROPRIETÀ

Nome Descrizione

ApplicationName Ottiene o imposta il nome dell'applicazione per cui archiviare e recuperare informazioni sui ruoli.

CacheRolesInCookie Ottiene un valore che indica se i ruoli dell'utente corrente sono memorizzati in un cookie.

CookieName Ottiene il nome del cookie in cui sono memorizzati i nomi dei ruoli.

CookiePath Ottiene il percorso del cookie dei nomi di ruoli memorizzati.

CookieProtectionValue Ottiene un valore che indica la modalità di protezione dei nomi di ruoli memorizzati in un cookie.

CookieRequireSSL Ottiene un valore che indica se il cookie dei nomi di ruoli richiede SSL per essere restituito al server.

CookieSlidingExpiration Indica se la data e l'ora di scadenza del cookie dei nomi di ruoli verranno reimpostate periodicamente.

CookieTimeout Ottiene il numero di minuti prima della scadenza del cookie.

CreatePersistentCookie

Ottiene un valore che indica se il cookie dei nomi di ruoli è basato sulla sessione o persistente.

Domain Ottiene il valore del dominio del cookie dei nomi di ruoli.

Enabled Ottiene o imposta un valore che indica se la gestione ruoli è attivata per l'applicazione Web corrente.

MaxCachedResults Ottiene il numero massimo di nomi di ruoli da memorizzare per un utente.

Provider Ottiene il provider di ruoli predefinito per l'applicazione.

Providers Ottiene un insieme dei provider di ruoli per l'applicazione ASP.NET.

Page 104: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 104 / 151

L ISTATI

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"/>

Page 105: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 105 / 151

<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" />

Page 106: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 106 / 151

<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; text-

align: center; display: block;

}

#colonna-sx .box, #colonna-dx .box, #principale .box{

padding: 10px;

Page 107: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 107 / 151

}

#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; font-

style: 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;

}

Page 108: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 108 / 151

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" Font-

Names="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>

Page 109: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 109 / 151

<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:[email protected]">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">

Page 110: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 110 / 151

<asp:HyperLink ID="HyLkWebmaster" runat="server"

NavigateUrl="mailto:[email protected]">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-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: 215px; font-size: 90%; font-family: Arial,

Helvetica, sans-serif; color: #CC3300;

Page 111: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 111 / 151

}

#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%; font-

size: 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{

Page 112: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 112 / 151

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; font-

style: 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>

Page 113: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 113 / 151

<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" 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" />

<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="border-

collapse:collapse;">

<tr>

<td>

<table border="0" cellpadding="0">

<tr>

<td align="center" colspan="2" style="color:White;background-

color:#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>

Page 114: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 114 / 151

<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>

Page 115: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 115 / 151

<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" PagerSettings-

Mode="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" PagerSettings-

Mode="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>

Page 116: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 116 / 151

<br />

</div>

</div>

<div id="colonna-dx">

<div class="box">

<asp:Calendar ID="CalendAdmin" runat="server" BackColor="#FFFFCC"

BorderColor="#663300" BorderWidth="1px" DayNameFormat="Shortest" Font-

Names="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:[email protected]">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 = ""

Page 117: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 117 / 151

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)

Page 118: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 118 / 151

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">

Page 119: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 119 / 151

<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>

Page 120: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 120 / 151

</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: [email protected]"

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>

Page 121: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 121 / 151

<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" Font-

Size="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-z0-

9]{8,16}" Display="None" ValidationGroup="Registrazione" ErrorMessage="- La

Password deve essere di lunghezza non inferiore a 8 e non superiore a 16

caratteri" />

Page 122: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 122 / 151

<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\-\.]+)@((\[([0-

9]{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">

Page 123: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 123 / 151

<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" Font-

Size="11pt" CellSpacing="2" HorizontalAlign="Left" PagerSettings-

Visible="False" RowStyle-Wrap="True" FooterStyle-Wrap="False"

CommandRowStyle-VerticalAlign="Top" CaptionAlign="Right" PagerStyle-

Wrap="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" ControlStyle-

BackColor="#FFFFE6" ItemStyle-

HorizontalAlign="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>

Page 124: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 124 / 151

</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>

Page 125: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 125 / 151

</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" Font-

Size="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" Font-

Underline="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>

Page 126: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 126 / 151

<td>&nbsp;&nbsp;Scrivi il nome del Ruolo da aggiungere:&nbsp;</td>

<td>

<asp:TextBox ID="RuoloNuovo" runat="server" Width="170" Font-

Names="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:[email protected]">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

Page 127: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 127 / 151

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)

Page 128: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 128 / 151

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()

Page 129: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 129 / 151

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">

Page 130: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 130 / 151

<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="~/mdb-

database/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" />

Page 131: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 131 / 151

<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" />

Page 132: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 132 / 151

<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>

Page 133: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 133 / 151

<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-zA-

Z]{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>

Page 134: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 134 / 151

<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-zA-

Z]{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>

Page 135: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 135 / 151

<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">

Page 136: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 136 / 151

</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>

Page 137: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 137 / 151

<br />

<div id="footer">

<p class="valid">Webmaster:

<asp:HyperLink ID="HyLkWebmaster" runat="server"

NavigateUrl="mailto:[email protected]">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

Page 138: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 138 / 151

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

Page 139: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 139 / 151

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

Page 140: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 140 / 151

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>

Page 141: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 141 / 151

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-bottom-

width: 1px; border-top-color: #999999; border-bottom-color: #999999; text-align: center;

font-family: Arial, Helvetica, sans-serif; font-size: 100%; color: #B9B900; vertical-

align: 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%; border-

color: #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;

}

Page 142: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 142 / 151

#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%; border-

color: #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{

Page 143: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 143 / 151

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; font-

style: 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>

Page 144: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 144 / 151

<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" Font-

Names="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" Font-

Size="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:[email protected]">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">

Page 145: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 145 / 151

<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" %>

Page 146: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 146 / 151

<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" Font-

Italic="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" Font-

Italic="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="~/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" 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" Font-

Italic="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>

Page 147: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 147 / 151

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

Page 148: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 148 / 151

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

Page 149: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 149 / 151

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\PAGWORD.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 />

Page 150: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 150 / 151

<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" Font-

Italic="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" Font-

Italic="True" ForeColor="#FF3300"></asp:Label><br />

<asp:Button ID="Step3_Button_Indietro" runat="server" Text="< Indietro"

Visible="False" /><br />

</div>

</div>

</asp:Content>

PRIVATE\PAGWORD.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

Page 151: Tutorial pratico - Creare un sito Asp Net 2.pdf

S V I L U P P A R E U N S I T O W E B A S P . N E T

sabato 6 luglio 2013 – Pag. 151 / 151

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