Guida al linguaggio di Programmazione ASPNET
ASPNET ossia Active Server Pages e NeT sono due sistemi progettati da Microsoft per rendere facile lo scoraggiatane compito di creare pagine Web dinamiche , interattive e basate essenzialmente su dati.
Il suffisso .Net sta per Microsoft.NET Framework, introdotto nel 2002 e rappresenta il sistema di base di Aps , capirete meglio in seguito. Quando abbiamo iniziato la scrittura di questa mini guida avevamo a disposizione due possibili vie ossia la progettazione di Aspnet con visual basic oppure introdurre l’innovativo C sharp o piu’ semplicemente C#, che l’innovativo linguaggio introdotto da Microsoft che nelle linee guida ricalca il Java.
Per utilizzare Asp.net il primo passo da fare è quello di scaricare dalla pagina Web di Microsoft il programma Visual WeB Developer che tanto per rendere l’idea è un po’ come il php per Dreamweaver.
Lo potete trovare al seguente indirizzo
http://www.microsoft.com/express/vwd
Nel caso microsoft l’avesse spostato ricercatelo con google. Quindi Scaricate e procedete con l’installazione, e quindi terminate e avviate il programma
La prima schermata che troverete se tutto è andata bene è la seguente…
Vediamo adesso come creare la nostra primissima pagina web, ossia andiamo su nuovo file e dopo selezioniamo su web C#, e da li sulla successiva finestra web form
Vi apparirà il seguente listato che andiamo ad esaminare
<%@ Page Language=”C#” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<script runat=”server”>
</script>
<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>
Quindi partendo dalla prima riga in alto abbiamo
<%@ Page Language=”C#” %>
è un markup significa che stiamo utilizzando una pagina ASP con linguaggio C#, la seconda riga
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
rappresenta lo standard della W3C organizzazioni che abbiamo utilizzato in questo foglio di stile…
mentre il rigo
<script runat=”server”>
indica al server che tale script verrà eseguito sul Server e a seguire tutto il codice html della pagina che come potete vedere per il momento è ancora ridotto veramente all’essenziale.. Nei prossimi capitoli incominceremo ad introdurre altro materiale..
I Comandi Server
Iniziamo adesso a vedere quelli che sono i comandi server, vi ricordare di avere gia’ visto l’attributo runat impostato su server. Iniziamo subito dicendovi che il codice C# che inseriremo nella nostra pagina web , dovra’ essere sempre racchiusa fra i tag di apertura e chiusura
<% e %>
Incominciamo subito dunque ad analizzare l’oggetto Response e scriviamo il seguente script
<%
Response.Write(“I love”);
Response. Write(“<br/>”);
Response.Write (“Visual Web Developer”);
alla fine nel nostro VWD dovrebbe apparire scritto
<%@ Page Language=”C#” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<script runat=”server”>
</script>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
<title></title>
</head>
<body>
<form id=”form1″ runat=”server”>
<div>
<%
Response.Write(“I love”);
Response. Write(“<br/>”);
Response.Write (“Visual Web Developer”);
%>
<br /> I ammo visual web developer <br />
</div>
</form>
</body>
</html>
Facciamo un passo successivo ossia abbiniamolo con l’oggetto Request.
Se il Browser ha necessità di passare ha necessità di passare informai al server, utilizza i parametri della query. Si tratta di coppie chiave/valore che tipicamente si vedono dopo le URL, ad esempio : http://www.moneycentral.msn.cm/detail/stock_quote?qdi&Symbol=MSFT
Questo esempio è una URL che punta al sito centrale MSN money per ricercare la quotazione del titolo Microsoft. Tutto ciò che si trova dopo il ? in http://www.moneycentral…… è un parametro costituito da una coppia nome/valore.
L’oggetto Request di Asp.net vi aiuta a processare questi parametri, pertanto andiamo a definire un parametra per mostrarvi come funziona. Esaminate il seguente codice.
<%
Response.Write(“I Love”)
Response.Write (“<br/>”);
Reesponse.Write (Request.QueryString[“value”]);
%>
La terza riga recupererà un parametro di nome “value” e lo scriverà nel markup HTML. Se non viene passato nulla, nulla verrà scritto in HTML..
IL BROWSER
Ora che abbiamo visto come potere fare per effettuare a scrivere un file guardiamo come si esegue in un browser web. Prima di tutto per fare questo occorre salvare il file in un’apposita cartella..
E per fare questo al momento basta digitare Save File As e dgt Salva. A questo punto il file è salvato.
A cesto punto basta selezionare View in Browser dal Menu File oppure l’icona View in Browser che trovare sulla
A questo punto vi si aprirà il browser che avete come predefinito e vi apparirà la relativa schermata , per il momento bianca. VI chiederete, ma per caricare una pagina web non si necessita di un server? Esattamente si, il bello di questo programma è che al suo interno ha anche un mini server incorporato che vi permetterà di vedere subito quello che state facendo senza la necessità di caricare il vostro file sul Web.
Incominciamo ad aggiungere un po’ di codice alla pagina appena creata ossia, scriviamo
Io amo Visual Web Developer,
magari incominciamo anche ad introdurre dei marcatori html e per fare questo facciamo immettiamo prima e dopo <br> e <br/>
come vedrete il programma cercherà di aiutargli suggerendoci le parole da inserire. Una volta fatto il listato che ci dovrebbe apparire sarà il seguente.
<%@ Page Language=”C#” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<script runat=”server”>
</script>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
<title></title>
</head>
<body>
<form id=”form1″ runat=”server”>
<div>
<br>I ammo visual web developer <br />
</div>
</form>
</body>
</html>
Visualizzate nel browser il nuovo risultato ottenuto, come noterete la scritta è appunto comparsa.
A questo punto come accade nelle pagine html normali possiamo aggiungere anche del codice html tanto per aggiungere funzionalità alla nostra pagina Javascript.
Primo Sito Web
In questo capitolo impareremo i rudimenti per la costruzione del primo Sito Web quindi dal men File scegliamo New Web Site e dopo Sito Web Aspnet, se fate caso a questo passaggio avete anche l’indicazione di dove trovare il vostro progetto all’interno del vostro Sito all’interno del vostro Computer. Per comodità cimiamo questo Sito PersonalPort. Apriamo l’origine del codice appena creato e a avremmo
<%@ 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>
che come vedete differisce dal precedente creato per alcuni particolari che sono rispettivamente
AutoEventWireip, Codefile e Inherits
Vediamo cosa sono rispettivamente
AutoEventWireup è generato per default da Visual Web Developer, praticamente anche se ancora non sappiamo cos’e’ è un gestore di evento, diciamo che ogni qual cosa si verifica un evento tipo pressione di un tasto questo viene generato automaticamente per essere poi gestito.
Codefile impostato a Default.aspx.cs indica al VWD di compilare il codice in questo file. Per esempio il Default.aspx.cs (Clicca due volte sulla destra Default.aspx ) è
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response;
}
}
Notate la presenza della funzione Page_Load che automaticamente carica la pagina appena questa viene aperta..
A questo punto provate a cliccare sulla freccia verde nella toolbar vicino a Visualizza nel Browser, si chiama avvia debug e alla successiva schermata che vi si apre cliccate su ok e ovviamente vi apparirà una pagina vuota del vostro browser predefinito.
Chiudete la finestra del browser, (importante altrimenti il server rimane sempre attivo)
Ed iniziamo ad analizzare il file web.config che è presente sulla destra sotto Default.aspx. Fateci un doppio click sopra e vi si aprirà una sfilza di dati in xml, in pratica è un file che auto generà il VWD per configurare il vostro sito.
Tolo di Amministrazione
Alcune specifiche di alcuni portali web consigliano di introdurre nel sito dei requisiti di sicurezza, ed iniziamo ad introdurne il prmo ossia , vediamo un po’ come realizzarlo.
Andiamo in Solution Esplorer apriamo il progetto Personal Portal precedentemente creato e procediamo nel seguente modo, ci spostiamo sulla destra dove è presente Esplora Soluzioni e clicchiamo sull’icona Configurazione Asp.net. Per intendersi è l’icona con il martelletto accanto al mondo web.
Una volta dgt si apre la pagina web del vostro browser predefinito. Come mostrato nella figura sottostante.
Dove fondamentalmente potete vedere tre schede.
Scheda Sicurezza Dove si impostano e si modificano gli utenti i ruoli e i permessi di accesso al sito.
Scheda Applicazione. Permette di gestire alcune impostazioni di configurazione al sito fra la quale le piu’ importanti sono le server e-mail e le impostazione di status debugghino e Trading.
Scheda Provider. Specifica dove e come memorizzare i dati di amministrazione dal sito Web.
Per il momento vedremo solamente la prima scheda per arrivare alla terza dobbiamo attendere i capitoli piu’ avanti.
Dimenticavo prima di partire appuratevi di avere installato sul vostro computer locale il relativo database sql server , noi consigliamo il 2005 o meli è quello con cui abbiamo realizzato la presente guida. Procediamo
Clicchiamo sulla scheda Sicurezza.
Dalla Sezione User Clicchiamo il collegamene Select autentication Type.
Selezioniamo From the intente e clicchiamo Done a questo punto dovremmo essere nella prima pagina che ci permette di effettuare l’inserimento del primo utente se tutto è filato liscio.
Ovviamente inserite voi stessi e sempre per prova provate a inserire una seconda utenza. Ovviamente sempre dalla schermata sicurezza potrete trovare anche le specifiche per gestire l’utenza , (edita user ) oppure direttamente cancellarla (delete user) a seconda ovviamente delle vostre esigenze.
Ora che il database con dentro le nostre password è stato creato procediamo un attimo ad esaminarlo e lo facciamo nel seguente modo
Ritorniamo nel VWD andiamo su esplora soluzioni diamo un refresh e vedremo comparire una nuovo oggetto in ASPENTTDB.MDF
Andiamo ad analizzarlo, clicchiamoci sopra andiamo sulla cartella Tables ed iniziamo ad aprire le cartelle che sono contenute in esse.
Individuiamo la cartella aspnet_User a questo punto compiamo due operazioni doppio click per vedere da quali campi la tabela è composta e invece tasto destro e click e dopo mostra dati tabella per visualizzare i dati che vi sono contenuti in essa..
A questo punto abbiamo cmq un’idea di quello che abbiamo fatto e procediamo alla creazione della prima pagina effettiva di login . Andiamo quindi su Esplora Soluzioni o Solutions Esplorerei a seconda che abbiate preso la versione in italiano o in inglese visualizzate il percorso
C:\…\PersonalPortal
e dopo tasto destro del mouse e selezionate aggiungete nuovo oggetto, selezionate dalla pagina che vi si apre la scritta Web Form e digitare Login.aspx nel campo Name, lasciate selezionato Pace Code in Separate File (ossia “posizionare il codice in un file separato” ).
Andate nella colonna di destra e scorretele finche’ non trovate il menu Accesso, apritelo e una volta fatto cercate login a questo punto non vi resta che trascinarlo all’interno della pagina dinamoca aspnet, assicurandovi pero’ prima di essere in progettazione.
Nella icona appena creata potete fare tutti gli opportuni cambiamenti che ritenete necessari agendo per esempio su formattazione automatica, cambierete cosi’ il layout della pagina che avete creato, cioè cio’ che i ovstri utenti vedranno arrivando nella pagina stessa.
Addirittura se volete che i vostri utenti effettuino il login quando entrano nella pagina come prima operazione potete settare questo comportamento nel seguente modo, in questo momento vi ricordiamo che la pagina che verrà caricata per prima diciamo di default è la pagina Default.aspx.
Andate quindi su Solution Explorer e selezionate la pagina login.aspx, tasto destro e cliccate su imposta come pagina principale.
A questo punto selezionate il controllo server login che sarebbe l’icona che abbiamo creato in progettazione e cliccate su proprietà , nella relativa icona che vi si è aperta sulla destra , con scritto Proprietà sopra, selezionate DestinatinPageUrl e dopo selezionate i … a questo punto vi si apre una nuova finestra e voi selezionate Default.aspx e cliccate su ok.
A questo punto il gioco è fatto potete andare sulla toolbar e digitare Runa per visualizzare il tutto.
Ovviamente se avrete effettuato correttamente il login la pagina che vi si aprirà sarà quella di default e quindi completamente vuota. Se sbaglierete l’accesso vi verrà visualizzato tentativo di login non corretto. Procediamo ancora introducendo i controlli server LoginName e LoginStatus.
Su molti siti Web, quando gli utenti sono loggati , il loro nome utente appare sul sito unitamente alla possibilità di eseguire il logout dal sito . Per questo Asp.Net mette a disposizione una rivoluzionaria classi di comandi che sono Login Name e Login Status.
Le Master Page
In questo capitolo inizieremo a fare la conoscenza con le pagine mastro una nuova innovativa tecnologia messa a disposizione da aspnet, in pratica si tratta di veri e propri template che permetto di centrallizzare il mark up del portale , detto proprio in soldoni si crea un template in una pagina aspnet e poi si permette alle altre pagine di utilizzare queste pagine.
Vediamo cmq in pratica come si utilizza. Andiamo su Esplora Soluzioni e selezioniamo aggiungi nuovo elemento, dalla finestra che si apre selezionare Pagina Master e digitare il nome PersonalPortal.master nella pagina che si è aperta e dopo aggiungi a questo punto la prima pagina mastro è stata creata.
Controlliamo il codice di questa pagina master appena creata ed iniziamo subito facendovi notare una sostanziale differenza , questa volta è presente un nuovo tag che si chiama
<asp:ContentPlaceHolder id=”ContentPlaceHolder1″ runat=”server”>
</asp:ContentPlaceHolder>
E ora vediamo fattivamente come utilizzarla.
Quando si utilizza una pagina master, questa fornisce tutto il markup e il codice che è comune a una pagina, che pertanto non dovrà avere i tag html, head o form la pagina master coniene questi tag.
Iniziamo a collegare la pagina di default.aspx alla Master Page nel seguente modo, prendiam la pagina default.aspx e cancelliamo per intero il suo contenuto, tranne la prima riga che rimarrà e quindi avremo:
<%@ Page Language=”C#” AutoEventWireup=”true” MasterPageFile =”~/MasterPages/PersonalPortal.master” CodeFile=”~/Default.aspx.cs” Inherits=”_Default” %>
mandiamo in esecuzione con il solito run o visualizza nel browser col risultato di ottenere una pagina completamente bianca. Adesso rincominciamo a rimettere i comandi controllo server precede mente introdotti.
Ma prima alcune precisazioni. La pagina master PersonalPortal ha fornito tutto il markup HTML della pagina, pertanto se si aggiunge ulteriore HTML o codice a PersonalPortal.master, qualsiasi pagina che la utilizza avrà questo markup e questo codice automaticamente aggiunto a essa.
Facciamo adesso il caso contrario ossia e se si volesse che il markup o il codice appaiono solo sulla stessa pagina e non su ogni pagina? Asp net mette per questo a disposizione un ulteriore controllo che si chiama ContentPlaceHolder . Si utilizza questo controllo sulla pagina master per determinare dove il markup verrà posizionato e il controlli Content sulla pagina per posizionare il markup e il codice specifico a quella pagina.
Come si puo’ notare dal listato dalla pagina master scritta e non ancora modificata.
<%@ Master Language=”C#” AutoEventWireup=”true” CodeFile=”PersonalPortal.master.cs” Inherits=”PersonalPortal” %>
<!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>
tale listato mostra che i controlli sono posizionati nel tag <head> e nel tag <div> del form. Il markup delle pagine che utilizzano la pagina master PersonalPortal hanno queste due posizione per aggiungere il contenuto.
Torniamo alla pagina Default.aspx e aggiungiamo un tag <asp:Content> nella pagina con un testo casuale I ADORO IL VSWD, la pagina dovrà risultare in questa maniera
<%@ Page Language=”C#” AutoEventWireup=”true” MasterPageFile =”~/MasterPages/PersonalPortal.master” CodeFile=”~/Default.aspx.cs” Inherits=”_Default” %>
<asp:Content ID=”SomeContent” ContentPlaceHolderID=”ContentPlaceHolder1″ runat=”server”>
IO ADORO IL VISUAL WEB DEVELOPER
</asp:Content>
Adesso che abbiamo visto il funzionamento basilare della master page incominciamo ad introdurvi degli altri elementi ossia le table. Quindi andiamo su PersonalPortal.master in modalità design e facciamo doppio click selezioniamo l’interno del content e andiamo in tabella ed inseriamo una tabella se l’operazione è andata a buon fine ci dovrebbe comparire una schermata del tipo.
Per questa prova mettiamo 3 righe e 2 colonne. Per chi è gia’ esperto di editor visuali potrà notare come il VWD riproduce tutte le funzionalità vedi unione di due o piu’ celle adiacenti e cosi’ via.
Per chi non ha esperienza consigliamo di spippolare un po’ con i comandi della figura sopra…danno non lo si potrà cmq fare.
Ad esempio sarà possibile appunto selezionare due celle adiacenti e con il tasto destro del mouse unirle.
Questa è una primissima infarinatura vedremo in seguito comandi piu’ approfonditi come i CSS e come poterli introdurre dentro il VWD
A questo punto raggiungiamo i Controlli login e LoginStatus come visto precedentemente nel capitolo 2. Ma questa volta le inseriamo nella Pagina Master, ossia dentro le tabelle create in precedenza.
alla fine dovremmo ottenere il seguente risultato
<%@ Page Language=”C#” AutoEventWireup=”true” MasterPageFile =”~/MasterPages/PersonalPortal.master” CodeFile=”~/Default.aspx.cs” Inherits=”_Default” %>
<asp:Content ID=”SomeContent” ContentPlaceHolderID=”ContentPlaceHolder1″ runat=”server”>
IO ADORO IL VISUAL WEB DEVELOPER
</asp:Content>
per la pagina di default mentre per la master page avremo
<%@ Master Language=”C#” AutoEventWireup=”true” CodeFile=”PersonalPortal.master.cs” Inherits=”PersonalPortal” %>
<!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>
<style type=”text/css”>
.style1
{
width: 100%;
}
</style>
</head>
<body>
<form id=”form1″ runat=”server”>
<div>
<asp:ContentPlaceHolder id=”ContentPlaceHolder1″ runat=”server”>
</asp:ContentPlaceHolder>
<table>
<tr>
<td>
<asp:LoginStatus ID=”LoginStatus1″ runat=”server” />
</td>
<td>
<asp:Login ID=”Login1″ runat=”server”>
</asp:Login>
</td>
</tr>
<tr>
<td>
</td>
<td>
</td>
</tr>
<tr>
<td colspan=”2″>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
Vedremo adesso un esempio di Master Pages nidificate.
Partiamo dal controllo server LoginName che permette di visualizzare il nome dell’utente nel caso questo sia loggato, mentre LoginStatus è un link verso una pagina che permette all’utente loggato di effettuare il relativo logout dalla pagina, entrambi li trovate nel menu accesso a questo punto non vi rimane che inserirli nella pagina Default.aspx sempre in progettazione. E Fare la relativa anteprima nel browser, come visto prima.
Volendo sempre da Accesso possiamo immettere anche il server controll per il change password una novità esclusiva di VWD 2008
E con questo concludiamo questo capitolo e passiamo al prossimo dove vi parleremo di un argomento molto interessante ed importante che sono le pagine master.
Controlli Server
Iniziamo l’introduzione ai controlli Server con l’aggiunta del comando label, quindi aprite il Personal Portal e introducete il comando label che trovate nella colonna di sinistra del vostro Visual Web Developer, nella sezione standard una volta introdotto digitate proprietà e vedete questa volta nella colonna di destra tutte le proprietà che potete modificare.
Niente di piu’ semplice.
Incominciamo adesso a creare un menu di navigazione per il nostro sito. Quindi facciamo i seguenti passi.
1. Clic destro sul progetto in Esplora Soluzioni e seleziona Aggiungi nuovo elemento.
2. Seleziona Mappa del Sito nel campo name digita Web in modo da creare web.sitemap che potrai vedere su Esplora Soluzioni.
se tutto è andato a buon fine troverete il seguente codice relativo
<?xml version=”1.0″ encoding=”utf-8″ ?>
<siteMap xmlns=”http://schemas.microsoft.com/AspNet/SiteMap-File-1.0″ >
<siteMapNode url=”” title=”” description=””>
<siteMapNode url=”” title=”” description=”” />
<siteMapNode url=”” title=”” description=”” />
</siteMapNode>
</siteMap>
come potete vedere si tratta di un campo xml in cui dovere e potere inserire i valori, facciamo il seguente esempio, modificate il file in modo da ottenere
<?xml version=”1.0″ encoding=”utf-8″ ?>
<siteMap xmlns=”http://schemas.microsoft.com/AspNet/SiteMap-File-1.0″ >
<siteMapNode url=”~/Default.aspx” title=”Home” description=””>
<siteMapNode url=”~/Admin/ChangePassword.aspx” title=”Change Password” description=”Change Your Password” />
<siteMapNode url=”” title=”” description=”” />
</siteMapNode>
</siteMap>
Come vedete abbiamo descritto il nodo radice e i sotto nodi alla radice. D’ora in avanti ogni volta che dovete aggiungere una nuova voce di menu per puntare a una pagina del sito, aprite questo file XML e modificatelo di conseguenza.
Vediamo adesso come possiamo connetterci a questo file. E per fare questo utilizziamo il comando SiteMapDataSource, andiamo quindi in Design e trasciniamo il controllo dalla sezione Data nei comandi del Visual Web Developer di Sinistra. Sempre assicurandovi di essere in nel Design di Personal Portal
Questo controllo di suo non è un controllo visuale e quindi per renderlo visibile bisogna connettersi e quindi sempre sulla sinistra andate su esplorazione e trascinate il controller Menu nel design sopra il sitemadatasource
A questo punto cliccate sulla freccetta in rilievo che è comparsa affianco del nuovo elemento introdotto ed in selezionare righine dei dati mettere SitemapDataSource1 come si puo’ vedere chiaramente in figura.
Create una directory Admin e dopo un file ChangePassword in esso per permettere ipoteticamente di potere cambiare pagina.
a questo punto non vi rimane che verificare che tutto sia andato effettivamente a buon fine cliccando run.
VI apparirà la scritta home e accanto ad essa la scritta Change Password cliccandoci sopra potrete andare alla pagina desiderata.
Visual Earth
Sicuramente ne’ avete gia’ sentito parlare, se ancora non l’avete fatto è sicuramente questa un’ottima occasione per introdurla, stiamo parlando di una tecnologia totalmente made in microsoft chiamata Visual Earth, molt comoda se avete un’azienda e volete abbellire il vostro sito.
Andate all’indirizzo
http://www.bing.com/maps/
non è lo scopo di questa guida spiegarvi dettagliatamente cosa sia virtuale art cmq chi desidera saperne di piu’ puo’ visitare il sito
http://dev.live.com/virtualearth/sdk/
Vediamo dunque come integrarlo nel nostro sito web. In pratica bisogna referenziare la pagina e si fa nel seguente modo
<script type=”text/javascript”
src=”http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6″> </script>
aggiungiamo anche un p’ di codice javascript in modo da potere utilizzare meli la mappa,
var map = null;
function GetMap()
{
map = new VEMap(‘myMap’);
map.LoadMap(null, 10, ‘h’, false);
}
l’oggetto VEMap e LoadMap esulano lo scopo di questa guida cmq sono i comandi per potere caricare determinate porizioni della mappa.
A questo punto modifichiamo il body in modo tale che la funzione GetMap venga caricato con la pagina e facciamo
<body onload=”GetMap(); “>
queste due porzioni di codice vanno inserite nel personal Portal in modo tale che alla fine il codice risulti il seguente.
<%@ Master Language=”C#” AutoEventWireup=”true” CodeFile=”PersonalPortal.master.cs” Inherits=”PersonalPortal” %>
<!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>
<script type=”text/javascript”
src=”http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6″> </script>
<script type =”text/javascript” >
var map = null;
function GetMap() {
map = new VEMap(‘myMap’);
map.LoadMap(null, 10, ‘h’, false);
}
</script>
<style type=”text/css”>
.style1
{
width: 100%;
}
.style2
{
height: 23px;
}
</style>
</head>
<body onload=”GetMap(); “>
<form id=”form1″ runat=”server”>
<div>
<asp:ContentPlaceHolder id=”ContentPlaceHolder1″ runat=”server”>
</asp:ContentPlaceHolder>
<table class=”style1″>
<tr>
<td>
<asp:LoginStatus ID=”LoginStatus1″ runat=”server” />
</td>
<td>
<asp:Login ID=”Login1″ runat=”server”>
</asp:Login>
</td>
</tr>
<tr>
<td>
</td>
<td>
</td>
</tr>
<tr>
<td colspan=”2″>
<asp:Label ID=”Label1″ runat=”server” Font-Bold=”True”
Text=”Quest Site è di propriety exclusive mea “></asp:Label>
</td>
</tr>
</table>
</div>
<asp:Menu ID=”Menu1″ runat=”server” DataSourceID=”SiteMapDataSource1″>
</asp:Menu>
<asp:SiteMapDataSource ID=”SiteMapDataSource1″ runat=”server” />
</form>
</body>
</html>
manca un ultima aggiunta e finalmente potremmo andare a vedere il risultati finale
e apriamo il nostro default.aspx nel seguente modo
<%@ Page Language=”C#” AutoEventWireup=”true” MasterPageFile =”~/MasterPages/PersonalPortal.master” CodeFile=”~/Default.aspx.cs” Inherits=”_Default” %>
<asp:Content ID=”SomeContent” ContentPlaceHolderID=”ContentPlaceHolder1″ runat=”server”>
<div id=’myMap’ style =”position:relative; width:600px; height:400px” > </div>
</asp:Content>
come potete verde nel div id abbiamo richiamato myMap che è l’oggetto che abbiamo istanziato prima nel Javascript.
Ma possiamo fare molto di piu’ sempre andando a leggere la documentazione di Visual Earth ci accorgiamo anche della presenza della funzione Find e quindi andiamo ad utilizzarla nel seguente modo aggiungendo nel JavaScript la seguente riga di comando.
map.Find (null, ‘Rome’ );
facciamo un altro passo avanti
Dove e Cosa
Facciamo un ulteriore passo in avanti e introduciamo un testo per potere poi ricercare una località specifica.
vediamo come modifichiamo il PersonalPortal introducendo la funzione Find nel seguente modo
<%@ Master Language=”C#” AutoEventWireup=”true” CodeFile=”PersonalPortal.master.cs” Inherits=”PersonalPortal” %>
<!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>
<script type=”text/javascript”
src=”http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6″> </script>
<script type =”text/javascript” >
var map = null;
function GetMap() {
map = new VEMap(‘myMap’);
map.LoadMap(null, 10, ‘h’, false);
map.Find(null, ‘Rome’);
}
function Find(what, where) {
try
{
map.Find(what, where);
}
catch(e) {
alert (e.message);
}
}
</script>
<style type=”text/css”>
.style1
{
width: 100%;
}
.style2
{
height: 23px;
}
</style>
</head>
<body onload=”GetMap(); “>
<form id=”form1″ runat=”server”>
<div>
<asp:ContentPlaceHolder id=”ContentPlaceHolder1″ runat=”server”>
</asp:ContentPlaceHolder>
<table class=”style1″>
<tr>
<td>
<asp:LoginStatus ID=”LoginStatus1″ runat=”server” />
</td>
<td>
<asp:Login ID=”Login1″ runat=”server”>
</asp:Login>
</td>
</tr>
<tr>
<td>
</td>
<td>
</td>
</tr>
<tr>
<td colspan=”2″>
<asp:Label ID=”Label1″ runat=”server” Font-Bold=”True”
Text=”Quest Site è di propriety exclusive mea “></asp:Label>
</td>
</tr>
</table>
</div>
<asp:Menu ID=”Menu1″ runat=”server” DataSourceID=”SiteMapDataSource1″>
</asp:Menu>
<asp:SiteMapDataSource ID=”SiteMapDataSource1″ runat=”server” />
<br />
</form>
</body>
</html>
e il default.aspx come segue
<%@ Page Language=”C#” AutoEventWireup=”true” MasterPageFile =”~/MasterPages/PersonalPortal.master” CodeFile=”~/Default.aspx.cs” Inherits=”_Default” %>
<asp:Content ID=”SomeContent” ContentPlaceHolderID=”ContentPlaceHolder1″ runat=”server”>
<div id=’myMap’ style =”position:relative; width:600px; height:400px” > </div>
<p>
What
<input id=”txtWhat” type=”text” name=”txtWhat” /></p>
<p>
Where
<input id=”txtWhere” type=”text” name=”txtWhere” /></p>
<p>
Sottometti
<input id=”find” type=”button” value =”Find” name=”find” onclick=”Find(TxtWhat.value, txtWhere.value);”
/></p>
</asp:Content>
Come potete vedere abbiamo modificato il default introducendo dei tag html come input txtwhat e txtwhere, digitando il bottone find questi valori che abbiamo inserito vengono passati alla funzione Find che fara’ il gioco ossia trovare il luogo ricercato.
Debug
Debugging (o semplicemente debug) è un’attività che consiste nella individuazione della porzione di software affetta da errore (bug) rilevati nei software a seguito dell’utilizzo del programma.
Dobbiamo pero’ introdurre subito una limitazione e cioe’il debugging di visual web developer è possibile sol con Microsoft Internet Explorer.
Quindi avviamo IE andiamo su Strumenti, Options dal menu, cliccare su avanzate, deselezionare disattiva script debugging
Torniamo al progetto VWB andiamo su Esplora Soluzioni, teniamo selezionat C:\…| e click tasto destro scegliamo Pagina delle proprietà e da qui opzioni di avvio, a questo punto deselezionare se gia’ non lo è la casella ASP.NET e quindi digitare invio.
E viene eseguito il debugging del sito per intero altrimenti si potrà scegliere anche di fare debugging pass passo, riga. Scegliamo infatti dal menu F11 per eseguire ogni istruzione passo per passo.
Una tecnica piu’ avanzata per analizzare il Javascript è quella dei break point ossia mettere dei Toggle Breakpoint attraverso il tasto F9 ed analizzare solamente spezzoni di codice
Database
Ed eccoci qui ad introdurre un argomento totalmente nuovo visto pero’ dalla parte dei Database, ossia i grandi raccoglitori di dati con cui lavorano appunto i linguaggi di programmazione. Ma cosa sono i Database. Occorre prendere familiarità quindi con le tabelle e i tipi di dati.
I database sono identificati univocamente da dei nomi , da delle tabelle con al loro interno dei dati messi in accordo con il tipo di dato che lo spazio (cella ) di quella tabella possiede. Facciamo un esempio , consideriamo di avere un tabella chiamata Laureati, quindi avremo come colonne
La colonna id che identifica il numero del laureato di tipo in
La colonna Nome e Cognome che identifica appunto il nominativo del laureato di tipo string
La Colonna Tipo di laurea che identifica la laurea conseguita di tipo string
La Colonna Votazione nella quale è messo il voto conseguito. di tipo in
Quindi in base a questi parametri la nostra tabella potrebbe essere popolata di questi valori
001 Michele Micheli Economia 110
002 Michela Magni Giurisprudenza 110
003 Elisabetta Greg oraci Lettere 100
E cosi’ via a scendere , ma che dati sono questi tipi di dati? Beh di vario tipo, per i numeri esatti , cioè senza virgola si usano i seguenti
bigint numeri interi di grossi dimensioni
int numeri interi di medie dimensioni
smallint piccole dimensioni
etc. etc.
Per le definizione esatte dei range di valori si rimanda ai testi specifici, qui ci preme soltanto sottolineare che la differenza è sostanziale in quanto quando si ha a che fare con grossi database l’utilizzo di memoria deve essere ottimizzato, ossia non ci si puo’ permettere di utilizzare un tipo di dato inappropriato se pur funzionante.
Continuiamo la notar trattazione con i numeri approssimati che sono
i Float e i real come sempre funzionano entrambe cambia il range che per il real va da -3.4 * 10^38 a 3.4 * 10^38 e cosi’ via.
Per i tipi di dato che rappresentano le date abbiamo
datetime e smalldatetime per convenienza utilizzate sempre il primo e diciamo che vi troverete sempre bene…
Per i caratteri abbiamo il solito char con varchar e maxchar, mentre per il testo abbiamo appunto la variabile text.
Queste tabelle pero’ possono essere messe in unione le une con le altre , questo tipo di correlazione fra tabelle che mette in dipendenza i dati delle une con quelli delle altre si chiama join, ma anche per questo rimandiamo ad una trattazione piu’ specifica che potrete trovare anche nelle nostre guide.
Le Query
Ora che abbiamo un’idea molto rudimentale di cosa sono i Database, vediamo come questi interagiscono con il linguaggio C# e il Visual Web Developer.
In verità tutti i database interagiscono con i linguaggi attraverso un meccanismo chiamato di Query che volgarmente significa interrogazioni.
Select
Incominciamo con la prima operazione , la piu’ semplice ossia la selezione la cui sintassi è
SELECT <nome colonna> From <nome tabella>
la cui comprensione è abbastanza immediata, se per esempio facevamo
SELECT Votazioni From Laureati
Ottenevamo i seguenti risultati
110
110
100
Facciamo un ulteriore passo introduciamo la clausola Where la cui sintassi è
SELECT <nome colonna> From <nome tabella> WHERE <nome colonna> <operatore> <valore>
Dove l’operatore supportati sono molteplici
=, <>, >,<,>= ,=<, BETWEEN, LIKE, IN
E siamo cmq sicuri che ne abbiamo dimenticati altri.
Altri tipi di Query sono le INSERT
per l’inserimento dei dati nel database
UPDATE
Per eseguire l’aggiornamento di dati gia’ presenti nel Database
Delete
Per cancellare una riga di dati presenti nel Database.
Ripetiamo che questa è una trattazione veramente superficiale del vasto mondo dei Database Sql Server nel particolare ma di tutto SQL in generale.
Tanto per dare un’idea per una trattazione completa occorrono dei libri.
Database e Visual Web Developer
Incominciamo adesso a vedere come interagiscono fra di loro Database e Visual Web Developer.
Primo pass VWD rappresenta un ottimo server quando è in funzione ma non un Database quindi vi occorre un Database , andate sul sito di Microsoft e scaricatevi SQL Server 2008 , al momento ancora stranamente in versione beta dato che siamo gia’ nel 2009, oppure il 2005 stabilissimo e piu’ che sufficiente per imparare a programmare.
Creiamo quindi adesso una tabella chiamata Toldo che avrà al suo interno le seguenti Colonne
ToDold che rappresenterà l’identificatore di riga della tabella, partirà da 1 e verrà incrementato ogni volta dello stesso valore.
Name che rappresenterà come verranno chiamati gli utenti
Complete che rappresenterà se le cose da fare sono state completate o meno e per questo gli attribuiremo un valore balenano
Quindi avviamo il Visual Web Developer e avviamo il nostro progetto Personal Portal come ormai siamo capacissimi di fare.
Quindi andiamo come sempre su Esplora Soluzione, selezioniamo C:\…\percorso url sito
e selezioniamo aggiungi nuovo elemento nella finestra che si apre selezioniamo Database Sql Server e nel campo nome mettiamo PPDatabase e aggiungi alle successive finestre che si aprono clicchiamo si, in pratica chiede di mettere il nuovo file nella directory App_Data, se tutto è andato a buon fine ci dovremmo ritrovare ad avere la seguente situazione nella Finestra esplora soluzioni
Vediamo ora come popolare i campi di tale tabella, andiamo quindi sempre sulla destra nella finestra Esplora Database, se non è stata attivata procedete nel seguente modo o andate su Visuali e cliccate su Esplora Database oppure Direttamente da Tastiera digitate
CTRL + ALT + S
Quindi adesso che siete in esplora Database espandete cliccando sul + di PPDDatabase.mdf e vi aprirà tutta una serie di sottocartelle fra le quali Tabella , la selezionate e tasto destro del mouse cliccate su aggiungi nuova tabella e completatela in modo da ottenere il seguente risultato
Selezione la Colonna ToDoId e andate sulla finestra Proprieta colonna e scorretela fin quando non trovate
Proprietà Colonne da qui Specifica identità ponetelo su si automaticamente incremento identità e inizio identità si posizionerà automaticamente su 1, questo vuole dire che ogni qual volta verrà effettuato un inserimento di dati nel Database, il campo corrispettivo a questa colonna verrà incrementato in modo automatico da solo di uno, poi in base alle vostre esigenze imparerete a incrementarlo come riterrete piu’ opportuno.
A questo punto non ci rimane che assegnare un nome al tutto quindi con nome colonna selezionato tasto destro del mouse e clicchiamo su Proprietà sulla relativa finestrella di destra chiamata proprietà diamo un nome al nostro oggetto in corrispondenza della casella (Nome) e lo chiamiamo appunto ToDo a questo punto con la tabella selezionata tasto destro e digitate Save ToDo, la tabella è definitivamente salvata.
Ora che abbiamo creato la tabella vediamo come dobbiamo farla per popolarla, ossia il VWD ha incorporato una funzione che ci permette di inserire i dati direttamente nel database senza ricorrere ad altri programmi di ausilio, vediamo come fare.
Da Esplora Database selezioniamo la tabella ToDo appena creata , tasta destro del mouse e clicchiamo questa volta su mostra dati tabella
Interrogare le tabelle del Database
Adesso che abbiamo imparato a creare le tabelle dei database e sappiamo anche come popolarle vediamo come potere estrapolare i dati in esse contenute attraverso il Visual Web Developer.
Andiamo nuovamente su Esplora Database e da qui selezioniamo la tabella ToDo come sempre tasto destro del Mouse e questa volta digitiamo Nuova Query e Aggiungiamo la tabella ToDo che oltretutto per il momento è anche l’unica che abbiamo creato.
Il prima passo è stato raggiunto adesso vediamo come realizzare praticamente l’istruzione Select. Dal riquadro che si è creato selezioniamo i campi ToDold, Name e Complete , che è un po’ come selezionare (tutte le colonne)
A questo punto andate su Progettazione Query e dopo ancora su esegui SQL oppure digitate direttamente CTRL R se tutto è andato esattamente vi apparirà una nuova tabella che sarà il risultato della query che avete eseguito, il risultato dovrebbe essere grosso modo il seguente.
con le opportune modifiche dovute al caso, vediamo adesso anche nello specifico come aggiungere anche la clausola Where a questo sistema. Nel Pannello Sql dove c’è scritto SELECT etc. etc. digitare e ottenere la seguente scritta
SELECT ToDoId, Name, Complete
FROM ToDo
Where Complete =’True’
verifichiamo la sintassi del SQL inserito andando su Progettazione Query e dal menu prendiamo la seconda voce ossia Verifica Sintassi SQL.
Se la sintassi è corretta possiamo a questo punto digitare CTRL + R e verificare il risultato. Se tutto è andato nel verso giusto sarà visualizzata solamente la riga contra distanza dalla colonna avente come ToDoId pari a 2.
Interfaccia Utente Basata sui Dati del Database
Ora che abbiamo visto come realizzare anche le interrogazioni facciamo un passo ulteriore, ossia la visualizzazione tramite il Visual C# su video relativamente alla connessione effettuata con il Database, introdurremo cioe’ i dataset.
Quindi apriamo nuovamente il progetto Personal Portal se prima l’avevamo chiuso e selezionando Esplora soluzioni, aggiungiamo nuovo elemento e questa volta selezioniamo DataSet e nel campo nome mettiamo il seguente valore ToDoDataSet
e clicchiamo su si alle finestre che si aprono, in questo modo il file verrà posizionato dentro la cartella App_Code.
A questo punto aprimao il file PPDatabase in Esplora Database e cliccate sulla tabella creata e come suggerisce la scritta della pagina del dataset trascinate la tabella nello spazio, se tutto è andato a buon fine questo è quello che otterrete visualizzato.
Quello che avete creato si chiama Datatable ossia una rappresentazione virtuale del database, alcune volte si trova anche con la dicitura database virtuale. Sotto notiamo anche la scritta ToDoTableAdapter, questo invece si chiama un TableAdapter e rappresenta come si possono aggiungere, aggiornare e eliminare i dati memorizzati in un datatable, come potete vedere è gia’ stato creato un metodo Fill. Vediamo adesso come possiamo configurarlo.
Clic destro sul metodo Fill sul metodo di ToDoTableAdapter e dalla schermata che segue selezionate Configura.
Nella finestra che si è aperta la Query è gia’ stata scritta, selezioniamo adesso Generatore di Query
e praticamente siamo ritornati alla schermata gia’ incontrata alcune volte fa. Anche qui avremmo potuto mettere la clausola Where e ottenere i soliti risultati.
Si può modificare il metodo esistenze ma vediamo adesso come crearne uno partendo da zero. Sempre con il file ToDoDataSet.xsd aperto in progettazione procediamo come segue.
Clicc destra sulla sezione ToDoTableAdapter con ToDoDataSet.xsd sulla superficie di progettazione.
Selezionare Aggiungi Query, digitare avanti nelle successive finestre, quella che ci richiede di utilizzare sql e quella che richiede l’utilizzo di Select.
A questo punto cliccare su Generatore di Query e vediamo il risultato, ma possiamo fare molto di piu’ ad esempio nel pannello SQL quello per intendersi dove è scritto
SELECT ToDoId, Name, Complete
From To Do
Aggiungete la seguente scritta
WHERE Complete = @IsComplete
questo @IsComplete ossia la chiocciolina seguita da un nome viene chiamato parametro dinamico e ha lo scopo appunto di variare dinamicamente la scelta, infatti clicchiamo su Esegui Query e si aprirà una finestrella che ci chiederà di settare il parametro
Noi lo settiamo su False e dgt Ok a questo punto il VWD visualizza il risultato della nostra Query
Digitando Ok il VWD visualizza appunto la query opportunamente modificata clicchiamo a questo punto su avanti e selezioniamo solamente Restituisci un DataTable.
Digitare GetToDoByStatus nel campo nome metodo che rappresenta cosa fa la query.
Clicchiamo su avanti questo punto ci appare la schermata di chiusura e digitiam fine. il Componente dovrebbe apparire nella finestra di progettazione del sistema se tutto è andato a buon fine ovviamente
Ora che abbiamo visto come si crea il dataset procediamo a creargli l’interfaccia utente vera e propria. Riprendiamo il nostro default.aspx e modifichiamo cosi’ fino ad ottenere il seguente risultato
Abbiamo cioè definito la nostra interfaccia Content che conterrà l’interfaccia per il Database ToDo
Creiamo dunque la nostra interfaccia grafica ma non con i dati contenuti nel database ma nel dataset creando un controll DropDownList
Per il momento seguite le istruzioni che vi diamo poi alla fine spiegheremo il tutto.
<asp:DropDownList ID=”DropDownList1″ runat=”server” AutoPostBack=”True”>
<asp:ListItem Selected=”True” Value=”False”>Not Done</asp:ListItem>
<asp:ListItem Value=”True”>Done</asp:ListItem>
</asp:DropDownList>
in pratica queste due righe significano che avremo un menu a tendina avente i valori Done e Not Done ma con selezionato il valore Not Done.
Inseriamo ora il controll Grid View o trascinandolo nel file da Progettazione oppure aggiungendo le righe nell’origine
<asp:GridView ID=”GridView1″ runat=”server” AllowPaging=”True”
</asp:GridView>
Andiamo adesso in progettazione e sulla freccia relativa al Gridview facciamo tast destro del mouse
e selezioniamo nuova origine dei dati in scegli rigine dei dati, nella successiva schermata che si apre scegliere oggetto e ObjectDataSource1 ed infine Ok. Nel menu successivo che si apre selezionare
ToDoDataSetTableAdapters.ToDoTableAdapter e cliccare avanti, nella successiva pagina selezionare Control nella richiesta dell’rigine dei parametri e Selezionare DropDownList1 dal menu a discesa del ControllID abbiam finito cliccare Finish.
In pratica abbiamo associato i dati contenuti nel dataset (non database) all’oggetto ObjectDataSource1 che si occuperà di visualizzarli nell’interfaccia.
A questo punto eseguite e verificate. Il listato grosso modo che vi dovreste trovare in default.aspx è il seguente.
<%@ Page Language=”C#” AutoEventWireup=”true” MasterPageFile =”~/MasterPages/PersonalPortal.master” CodeFile=”~/Default.aspx.cs” Inherits=”_Default” %>
<asp:Content ID=”SomeContent” ContentPlaceHolderID=”ContentPlaceHolder1″ runat=”server”>
<div id=’myMap’ style =”position:relative; width:600px; height:400px” > </div>
What:<input id=”txtWhat” type=”text” name=”txtWhat” />
Where:<input id=”txtWhere” type=”text” name=”txtWhere” />
<input id=”find” type=”button” value=”Find” name=”find” onclick=”Find(txtWhat.value,txtWhere.value);” />
Status:
<asp:DropDownList ID=”DropDownList1″ runat=”server” AutoPostBack=”True”>
<asp:ListItem Selected=”True” Value=”False”>Not Done</asp:ListItem>
<asp:ListItem Value=”True”>Done</asp:ListItem>
</asp:DropDownList>
<asp:GridView ID=”GridView1″ runat=”server” AllowPaging=”True”
AllowSorting=”True” AutoGenerateColumns=”False”
DataSourceID=”ObjectDataSource1″>
<Columns>
<asp:BoundField DataField=”ToDoId” HeaderText=”ToDoId” InsertVisible=”False”
ReadOnly=”True” SortExpression=”ToDoId” />
<asp:BoundField DataField=”Name” HeaderText=”Name” SortExpression=”Name” />
<asp:CheckBoxField DataField=”Complete” HeaderText=”Complete”
SortExpression=”Complete” />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID=”ObjectDataSource1″ runat=”server”
InsertMethod=”Insert” OldValuesParameterFormatString=”original_{0}”
SelectMethod=”GetToDoByStatus”
TypeName=”ToDoDataSetTableAdapters.ToDoTableAdapter”>
<SelectParameters>
<asp:ControlParameter ControlID=”DropDownList1″ Name=”IsComplete”
PropertyName=”SelectedValue” Type=”Boolean” />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name=”Name” Type=”String” />
<asp:Parameter Name=”Complete” Type=”Boolean” />
</InsertParameters>
</asp:ObjectDataSource>
</asp:Content>
Come potete vedere è possibile visualizzare i dati ma non è possibile cambiarli, diciamo per esempio che ad un certo punto un processo risulta completato e quindi vogliamo modificare tale valore.
Quindi andiamo su origine di ToTableAdapter di ToDoDataSet.xsd e tasto destro aggiungiamo una query, selezioniamo Uso Sql e avanti dopo selezioniamo UPDATE
Clicchiamo su Generatore di Query e dopo ok, nel riquadro superiore aggiungiamo una tabella con il tasto destro del mouse e clicca chiudi, nello spazio Sql andiamo a scrivere
UPDATE ToDo
SET Name = @Name, Complete = @Complete
WHERE (ToDoId = @original_ToDoId)
dove l’ultima riga viene interpretata come ToDoId= originale chiave primaria.
Nella pagina successiva , lasciare il nome di default UpdateQuery e dgt fine.
Andiamo adesso a modificare il GridView nel default.
Quindi si seleziona il controllo ToDo GridView nel designer. Da qui modifica Colonna e si scorre fin quando non si trova CommandField.
Si seleziona Modifca, Aggiorna, Annulla e si clicca aggiungi. Si sposta nello spazio Sottostante tramite l’utilizzo delle frecce Modifica, Aggiorna, Annulla in prima posizione. Si clicca su Ok
A questo punto sempre su Designer si va sul ObjectDataSource1 sotto il controllo GridView e si selezione Configura sorgente dati, cliccare su Update e selezionare UpdateQuery e cliccare finish
Il Gioco è fatto cliccare su Run e verificare il risultato ottenuto.
Ora che abbiamo visto come si crea il dataset procediamo a creargli l’interfaccia utente vera e propria. Riprendiamo il nostro default.aspx e modifichiamo cosi’ fino ad ottenere il seguente risultato
Abbiamo cioè definito la nostra interfaccia Content che conterrà l’interfaccia per il Database ToDo
Creiamo dunque la nostra interfaccia grafica ma non con i dati contenuti nel database ma nel dataset creando un controll DropDownList
Per il momento seguite le istruzioni che vi diamo poi alla fine spiegheremo il tutto.
<asp:DropDownList ID=”DropDownList1″ runat=”server” AutoPostBack=”True”>
<asp:ListItem Selected=”True” Value=”False”>Not Done</asp:ListItem>
<asp:ListItem Value=”True”>Done</asp:ListItem>
</asp:DropDownList>
in pratica queste due righe significano che avremo un menu a tendina avente i valori Done e Not Done ma con selezionato il valore Not Done.
Inseriamo ora il controll Grid View o trascinandolo nel file da Progettazione oppure aggiungendo le righe nell’origine
<asp:GridView ID=”GridView1″ runat=”server” AllowPaging=”True”
</asp:GridView>
Andiamo adesso in progettazione e sulla freccia relativa al Gridview facciamo tast destro del mouse
e selezioniamo nuova origine dei dati in scegli rigine dei dati, nella successiva schermata che si apre scegliere oggetto e ObjectDataSource1 ed infine Ok. Nel menu successivo che si apre selezionare
ToDoDataSetTableAdapters.ToDoTableAdapter e cliccare avanti, nella successiva pagina selezionare Control nella richiesta dell’rigine dei parametri e Selezionare DropDownList1 dal menu a discesa del ControllID abbiam finito cliccare Finish.
In pratica abbiamo associato i dati contenuti nel dataset (non database) all’oggetto ObjectDataSource1 che si occuperà di visualizzarli nell’interfaccia.
A questo punto eseguite e verificate. Il listato grosso modo che vi dovreste trovare in default.aspx è il seguente.
<%@ Page Language=”C#” AutoEventWireup=”true” MasterPageFile =”~/MasterPages/PersonalPortal.master” CodeFile=”~/Default.aspx.cs” Inherits=”_Default” %>
<asp:Content ID=”SomeContent” ContentPlaceHolderID=”ContentPlaceHolder1″ runat=”server”>
<div id=’myMap’ style =”position:relative; width:600px; height:400px” > </div>
What:<input id=”txtWhat” type=”text” name=”txtWhat” />
Where:<input id=”txtWhere” type=”text” name=”txtWhere” />
<input id=”find” type=”button” value=”Find” name=”find” onclick=”Find(txtWhat.value,txtWhere.value);” />
Status:
<asp:DropDownList ID=”DropDownList1″ runat=”server” AutoPostBack=”True”>
<asp:ListItem Selected=”True” Value=”False”>Not Done</asp:ListItem>
<asp:ListItem Value=”True”>Done</asp:ListItem>
</asp:DropDownList>
<asp:GridView ID=”GridView1″ runat=”server” AllowPaging=”True”
AllowSorting=”True” AutoGenerateColumns=”False”
DataSourceID=”ObjectDataSource1″>
<Columns>
<asp:BoundField DataField=”ToDoId” HeaderText=”ToDoId” InsertVisible=”False”
ReadOnly=”True” SortExpression=”ToDoId” />
<asp:BoundField DataField=”Name” HeaderText=”Name” SortExpression=”Name” />
<asp:CheckBoxField DataField=”Complete” HeaderText=”Complete”
SortExpression=”Complete” />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID=”ObjectDataSource1″ runat=”server”
InsertMethod=”Insert” OldValuesParameterFormatString=”original_{0}”
SelectMethod=”GetToDoByStatus”
TypeName=”ToDoDataSetTableAdapters.ToDoTableAdapter”>
<SelectParameters>
<asp:ControlParameter ControlID=”DropDownList1″ Name=”IsComplete”
PropertyName=”SelectedValue” Type=”Boolean” />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name=”Name” Type=”String” />
<asp:Parameter Name=”Complete” Type=”Boolean” />
</InsertParameters>
</asp:ObjectDataSource>
</asp:Content>
Come potete vedere è possibile visualizzare i dati ma non è possibile cambiarli, diciamo per esempio che ad un certo punto un processo risulta completato e quindi vogliamo modificare tale valore.
Quindi andiamo su origine di ToTableAdapter di ToDoDataSet.xsd e tasto destro aggiungiamo una query, selezioniamo Uso Sql e avanti dopo selezioniamo UPDATE
Clicchiamo su Generatore di Query e dopo ok, nel riquadro superiore aggiungiamo una tabella con il tastò destro del mouse e clicca chiudi, nello spazio Sql andiamo a scrivere
UPDATE ToDo
SET Name = @Name, Complete = @Complete
WHERE (ToDoId = @original_ToDoId)
dove l’ultima riga viene interpretata come ToDoId= orginale chiave primaria.
Nella pagina successiva , lasciare il nome di default UpdateQuery e dgt fine.
Andiamo adesso a modificare il GridView nel default.
Quindi si seleziona il controllo ToDo GridView nel designer. Da qui modifica Colonna e si soccre fin quando non si trova CommandField.
Si seleziona Modifca, Aggiorna, Annulla e si clicca aggiungi. Si sposta nello spazio Sottostante tramite l’utilizzo delle frecce Modifica, Aggiorna, Annulla in prima posizione. Si clicca su Ok
A questo punto sempre su Designer si va sul ObjectDataSource1 sotto il controllo GridView e si selezione Configura sorgente dati, cliccare su Update e selezionare UpdateQuery e cliccare finish
Il Gioco è fatto cliccare su Run e verificare il risultato ottenuto.
CSS
Introduciamo in questo capitolo un nuovo argomento ossia i CSS o detti ancora in modo piu’ familiare i Fogli di Stile.
Ma cosa sono i fogli di stile, diciamo che fondamentalmente sono una facilitazione che è stata introdotta per creare lo stile di una pagina HTML.
Diamone subito un esempio per comprendere subito di cosa stiamo parlando, ma vi precisiamo pero’ che noi daremo un breve sguardo per una guida completa vi rimandiamo a questo Link.
Facciamo subito un esempio pratico, nel nostro testo della pagina troveremo un testo HTML cosi’ scritto
<h1> Hello World!</h1>
nel body
e nell’head un collegamento al foglio di stile tipo import /Stile/Foglio.css
mentre nel file Foglio.css potremmo trovare fra le altre voci un paragrafo dedicato ad headline che piu’ o meno ha la possibile seguente composizione.
.headline
{
text-decoratin: underline;
font-weight : bold;
color : Red;
font-family: Arial
}
Le voci riportate , sono di fatto le voci che definiscono come appaiono all’interno dell html i vari paragrafi, in questo caso come appare la scritta Hello World. Ribadiamo che questo è solamente un esempio a livello molto alto per vedere nello specifico il funzionamento rimandiamo alla guida che ribadiamo potete trovare qui.
Quindi dando per assodato che vi siate letti questa guida sui CSS aprite il progetto Personal Portal e una volta fatto aprite il solito progetto CSS andate su esplora soluzioni, come al solito cliccate su aggiungi nuovo elemento e questa volta cliccate sulla voce Foglio di stile. Chiamate questo foglio di stile PersonalPortal
a questo punto non dovete fare altro che copia incollare su questo nuovo file il seguente
.portallayout
{
width: 810px;
}
.mydocsheader
{
width: 254px;
height: 66px;
background-repeat: no-repeat;
background-image: url(Images/mydocsheader.png);
padding-bottom: 10px;
}
.mymapheader
{
width: 210px;
height: 66px;
background-repeat: no-repeat;
background-image: url(Images/mymapheader.png);
padding-bottom: 10px;
}
.todolistheader
{
width: 210px;
height: 66px;
background-repeat: no-repeat;
background-image: url(Images/todobanner.png);
padding-bottom: 10px;
}
td.sidebar
{
width: 200px;
padding-left:10px;
padding-top:10px;
}
td.header
{
height:174px;
background-repeat: no-repeat;
background-color: #10377C;
background-image: url(Images/blog-title.png);
}
* html .header h2 {
top: 35px;
}
* html .todoheader, * html .insertheader {
height: 1%;
}
a, a:visited {
text-decoration: none;
}
a:hover, input {
color: #333333;
}
form
{
width: 375px;
}
body {
background: #6B91C3;
font: “Segoe UI”, Segoe, sans-serif;
margin: 0;
padding: 18px;
font-weight:bold;
font-size:medium;
}
em {
background: #EEEEEE;
font-style: normal;
}
li {
background: url(images/bullet_purple.gif) top left no-repeat;
padding: 0 0 0 18px;
}
p {
line-height: 18px;
margin: 5px;
}
p,li, input {
color: #333333;
font: small “Segoe UI”, Segoe, sans-serif;
padding: 0;
}
ul {
list-style: none;
margin: 5px;
padding: 0;
}
.placeholder {
color: #003399;
font: bold medium “Segoe UI”, Segoe, sans-serif;
height: 40px;
}
.content {
float: left;
margin: 5px 5px;
text-align: left;
}
.detailsview .actions div {
float: right;
text-align: right;
width: 95px;
padding-right: 2px;
}
.detailsview td {
background: #D7E6F4;
color: #333333;
font: small “Segoe UI”, Segoe, sans-serif;
padding: 15px 10px 10px 10px;
}
.detailsview td a {
color: #0066CC;
font: bold small “Segoe UI”, Segoe, sans-serif;
padding-right: 10px;
}
.detailsview td a:hover {
font-weight: bold;
color: #333;
}
.detailsview th {
background: #4168BD;
color: #FFFFFF;
font: small “Segoe UI”, Segoe, sans-serif;
letter-spacing: 0;
padding: 3px 8px 5px;
padding: 2px;
text-align: left;
}
.detailsview tr.header {
background: #C5DBF7;
padding: 3px 8px 5px;
}
.gridview .actions div {
float: right;
padding-right: 2px;
text-align: right;
width: 95px;
}
.gridview .edit td,.gridview .create td {
background: #DAFFCD;
padding: 4px;
border-bottom: solid 2px #FFFFFF;
border-top: solid 2px #FFFFFF;
}
.gridview td {
background: #D7E6F4;
border-bottom: solid 1px #C5DBF7;
color: #333333;
font: small “Segoe UI”, Segoe, sans-serif;
padding: 5px 4px;
}
.gridview td a{
color: #0066CC;
font: bold small “Segoe UI”,Segoe,sans-serif;
padding: 2px;
text-decoration: none;
}
.gridview td a:hover {
color: #333333;
font-weight: bold;
}
.gridview th {
background: #4168BD;
color: #FFFFFF;
font: small “Segoe UI”, Segoe, sans-serif;
letter-spacing: 0;
padding: 4px;
text-align: left;
}
.gridview th a{
color: #FFFFFF;
font: bold small “Segoe UI”,Segoe,sans-serif;
}
.gridview th a:hover{
color: #00FF00;
}
.gridview tr.even td,.detailsview tr.even td{
background: #FFFFFF;
}
.gridview tr.header {
background: #C5DBF7;
}
.gridview,.detailsview {
width: 100%;
}
.header h1 {
color: #10377C;
font: bold xx-large “Segoe UI”, Segoe, sans-serif;
margin: 0px;
}
.header h2 {
color: #666666;
font: x-small “Segoe UI”, Segoe, sans-serif;
position: absolute;
top: 28px;
}
.header h2 a {
color: #6600CC;
font-weight: normal;
}
.insert {
width: 300px;
}
.insert span {
font-family: “Segoe UI”, Segoe, sans-serif;
}
.insertheader
{
color: Silver;
background: #10377C url(images/add.gif) 6px 50% no-repeat;
margin-top: 25px;
padding-left: 25px;
position: relative;
font-size:medium;
font-weight:bold;
}
.insertheader a {
color: #FFFFFF;
font: bold medium “Segoe UI”, Segoe, sans-serif;
margin-left: 20px;
}
.menu {
border-width: 1px;
float: left;
margin: 20px 5px;
width: 150px;
}
.progress {
color: #FFFF99;
float: right;
font: bold x-large “Segoe UI”, Segoe, sans-serif;
margin-top: -20px;
}
.rss {
margin-top: 20px;
}
.todoheader
{
color: Silver;
background: #10377C;
position: relative;
font-weight:bold;
font-size:medium;
}
.todoheader h2
{
/*background: url(images/corner.gif) top right no-repeat; */
color: #FFFFFF;
font: bold large “Segoe UI”, Segoe, sans-serif;
margin: 0;
padding: 8px 5px 5px 5px;
}
.insertheader h2 {
color: #FFFFFF;
font: bold medium “Segoe UI”, Segoe, sans-serif;
margin: 0;
padding: 8px 5px 5px 5px;
}
.updateprogress {
color: #FFFFFF;
font: bold large “Segoe UI”, Segoe, sans-serif;
}
Andare su Personal Portal e cliccare su Visualizza e da li Applica Stili, dovrebbe essere apparsa una nuova schermata sulla toolblox di sinistra da li cliccate su associa Foglio di stile e nella successiva finestra che vi si apre cliccate sul foglio di Stile PersonalPortal.css
Se andate sulla pagina PersonalPortal.master potrete notare l’aggiunta di nuovi colori e se andate nella vista codice potrete vedere che nell’head è apparso un link di collegamento che è
<link href=”../PersonalPortal.css” rel=”stylesheet” type=”text/css” />
Andiamo su Visualizza e da qui gestisci Stili, fatto questo possiamo andare sul body sulla toolbox di sinistra e cliccare sul body e vediamo alcune cose ossia
il background che è quello che ha dato il colore blu alla pagina, potete vedere anche il Font che in pratica è il carattere con cui vedete le scritte nella pagina e le dimensione con cui viene scritte , quindi in questo caso il size è impostato su medium.
Ora cliccate sulle varie voci del personalportal.css dalla pagina PersonalPortal.master per esempio td.sidebar sulla sinistra fate con il tasto destro del mouse click sulla voce applica stile, il cerchio verde verrà cosi’ circondato da un cerchio di colore grigio. Fatto quella classe è attivata.
Se andiamo a vedere la classe td.header com’è fatta potrete vedere che essa fa anche dei riferimenti a dei file immagine nella cartella Images che ovviamente abbiamo introdotto noi a nostro piacimento, vi invitiamo a fare altrettanto per esercizio.
td.header
{
height:174px;
background-repeat: no-repeat;
background-color: #10377C;
background-image: url(Images/blog-title.png);
}
Andate sul Run ed il risultato dovrebbe essere qualcosa del tipo.
Adesso il concetto dovrebbe essere abbastanza chiaro, facciamo cmq un UpGrade , andiamo su PersonalMaster.Css e selezioniamo lo spazio fra due tr tenendolo selezioniato, una cosa del genere per intendersi…
<tr>
codice contenuto
</tr>
andiamo su Progettazione e con questo sottolineato ci spostiamo sulla casella di destra e per esempio andiamo su mymapheader e la attiviamo.
Ripetiamo questa operazione per due tr successivi e questa volta per esempio gli associamo todolistheader
In pratica con questo meccanismo è possibile associare ciascuna voce del foglio di stile a nostro piacimento e ottenere cosi’ una grafica personalizzata, anche se bisognerebbe essere un po’ piu’ precisi altrimenti dgt Run si corre il serio rischio di ritrovarsi di fronte ad una babele del genere…
In parole molte povere prima di imparare a programmare , dovete imparare a progettare…pensate solamente che nelle grandi case di software i programmatori veri e propri sono una figura ben distinta rispetto a quelli che progettano il sito.
I Mashup
Adesso che sappiamo come costruire un sito in ogni sua parte facciamo un passo indietro e vediamo come potere fare gli User Control e la relativa Validazione
Con l’introduzione dei Validator Control nelle nuove tecnologie Asp.net è ora possibile coin pochi clic per esempio costruirsi dei campi connettenti email e altro , il Framework.net si occuperà da solo di effettuare i controlli lato client e server, indipendentemente da quale sia il browser che l’utente sta utilizzando.
All’interno di uno User Control è possibile inserire qualsiasi altro tipo di controllo che sia WebCotrol html control , user e webpart.
Vediamo come realizzare in pratica questo di operazione.
Eravamo rimasti alla finestra che ci richiede una chiave , è una finestrella tipo pop up in cui trovate scritto nel primo rigo
Click here to sign up for a Windows Live News Search key, è evidentemente un link nel quale dovrete cliccare per essere diretti ad un altro modulo che dovrete compilare, al termine di tale complilazione Windows Live vi rilascerà una chiave che copierete/incollerete nel Live News che a questo al posto di Missing Key, scriverà You Have a Key insomma il gioco è fatto.
Cliccate sull’icona chiave inglese a fianco vi chiederà di immettere dei valori voi per esempio mettete come query / value ed inserire Atlanta e in count /value 20 e ovviamente ok, tornare alla visualizzazione precedente e sempre dalla sezione del pannello Block , dalla sezione News & Rss trascinare il blocco News Reader dentro l’opportuna area.
A questo punto cliccate il pallino sul lato destro del blocco Live News per trascinare un collegamento, Il pallino del News Reader sul lato sinistro si ingrandirà e diventerà arancione, Cliccare per connettere i due blocchi.
Se tutto è andato nel verso corretto dovreste trovarvi di fronte ad una situazione del genere.
a questo punto il successivo pass è cliccare sulla chiave inglese di News Reader, ed immettere dei dati a vostro piacimento nei
campi richiesti, cliccate sull’ icona chiave inglese grossa sulla destra in alto e dopo Run
Se tutto è andato bene vi si dovrebbe presentare la situazione sopra, a questo punto cliccate Save digitare nel successivo campo le Mie Notizie, cliccare nella sezione terms o Use e Accettare sSalvare
Il Gioco è quasi fatto, a questo punto andate su
http://popfly.com/Overview/Esplorer.aspx
E fate il Download Popfly Explorer
Anche è una versione Beta vi posso assicurare che funziona veramente alla perfezione, quindi scaricate e installatela, a questo punto è giunto il momento di aprire il Visual Web Developer e per la precisione.
A chiesto punto siamo quasi pronti è il momento di riavviare il Visual Web Developer ma lo scopriremo solamente nella lezione successiva
I DataReader
Iniziamo con questo capitolo una serie di approfondimenti per quanto riguarda il Aspenet , approfondendo alcune delle ultime tecnologie introdotte da Aspnet 3.5. Un DataSet è da considerarsi alla stregua di un piccolo Database Programmato,. Il Sulka permette di compiere una sieri di operazioni sui dati in elaborazione.. Le tabelle appartenenti a un Dataset possono essere messe in relazione anche tra di loro con dei collegamenti definiti relazioni.
Le istruzioni per la creazione di un Data Set sono
System.Data.DataSet DS_01 = new DataSet (“Primo DataSet”);
mentre per creare un database contenente per esempio nomi utenti e cognomi di dipendenti si fa
DataTable DT_01 = new DataTable (“Utenti”);
DS_01.Tables.Add(DT_01);
vediamo adesso invece come popolare i campi della tabella
//Contatore Campo ID
DataColumn DC_ID =
new System.Data.DataColumn (“ID”, typeof (int));
DC_ID.AutoIncrement = true;
DC_ID.AllowDBnull = false;
//Nome Utente
DataColumn DC_NOME = new System.Data.
DataColumn(“Nome”, typeof(string);
DC_ID.AllowDBNull=false;
DT_01.Columns.Add(DC_NOME);
//Cognome Utente
DataColumn DC_COGNOME = new System.Data.
DataColumn(“Cognome”, typeof(string);
DC_ID.AllowDBNull=false;
DT_01.Columns.Add(DC_COGNOME);
Come si vede abbiamo definito la prima colonna auto incrementante con il campo id, questa vuol dire che ogni qual volta si inserisce un valore questo finisce per incrementare a sua volta quel determinato campo da solo.
Da notare anche che al termine di ogni colonna abbiamo inserito la voce
DT_01.Columns.Add(<nomecolonna>);
Le tabelle del database sono state create adesso occorre anche popolarle e questo lo facciamo ricorrendo ai DataRow nel seguente modo
DataRow u1 = new DataRow();
u1 = DT_01.NewRow();
E per aggiungere il primo utente faremo semplicemente
u1[“Nome”] =”Alessio”;
u1[“Cognome”] = “Marziali”M
DT_01.Rows.Add(u1);
Supponiamo adesso di avere la necessità di avere due o piu’ tabelle e doverle mettere in qualche modo in collegamento fra di loro , in questo caso dovremo fare
DataTable DT_02 = new DataTable (“Jobs”);
DS_02.Tables.Add(DT_02);
//introduciamo adesso il solito campo contatore
DataColumn D2_IDJOBS =
new System.Data.DataColumn (“IDJOBS”, typeof (int));
D2_IDJOB..AutoIncrement = true;
D2_IDJOB.AllowDBnull = false;
DT_02.Column.Add(D2_IDJOB);
//CREIAMO ADESSO UNA TABELLA X UTENTE
DataColumn D2_Utente =
new .DataColumn (“Utente”, typeof (int));
D2_Utente..AutoIncrement = true;
D2_Utente.AllowDBnull = false;
DT_02.Column.Add(D2_Utente);
//creiamo adesso anche un campo descrizione.
DataColumn D2_Desc =
new System.Data.DataColumn (“Desc”, typeof (int));;
D2_Desc.AllowDBnull = false;
DT_02.Column.Add(D2_Desc);
// E adesso vediamo come si crea il primo oggetto DataRow, ossia il primo elemento che mettiamo nel database virtuale ossia nel nostro DataSet
DataRow j1 = new DataRow();
j1[“Utente”] =1;
j1[“Desc”]=”Capitolo Adonet”;
DT_02.Row.Add(j1);
//A questo punto vediamo come si possa creare una relazione a livello Dataset fra le colonne ID di //DT_01 e Utente di DT_02
Quindi si utilizzerà un oggetto chiamato DataRelation che sarà cosi’ costruito
DataRelation dRel1 = new DataRelation (“UtentiJobs”, DT_01.Columns[“ID”], DT_02.Columns[“Utente”]);
DS_01.Relations.Add(dRel1);
Il database virtuale è cosi creato , e quello che abbiamo fatto è abbastanza immediato, abbiamo prima costruito la relazione e dopo l’abbiamo messa in comunicazione fra di se.
Vediamo adesso come implementare un DataSet con i dati provenienti da una tabella residente in un database.
Per fare questo supponiamo di essere in possesso di un database gia’ formato chiamato db.mdb e posizionato dentro la cartella site , quindi avremo
OleDbConnection mdbConnection = new OleDbConnection ( “Provider = Microsoft.Jet.OleDB.40; DataSource = C:\\site\db.mdb”);
// queste operazione si occuperanno di stabilire se è meno possibile di effettuare il collegamento con il nostro database.
try
{
mdbConnection. Open();
}
catch (Exception Ex)
{
Response.Write (“Impossibile aprire una connessione con il Database “);
}
// Adesso preleviamo i dati contenuti
OleDbDataAdapter _cmd = new OleDbDataAdapeter (“Select * From Utenti”, mdbConnection);
//Creiamo un oggetto Dataset
DataSet ds = new DataSet();
//Non ci rimane che riempire il nostro dataset con i dati provenienti dal database
_cmd.Fill(ds, “Utenti”);
// e chiudere la connessione, per la verità dovrebbe essere un’operazione che compie da solo, ma una precauzione in piu’ non basta mai.
if (mdConnection.State != System.Data.ConnectionState.Closed)
{
mdbConnection.Close();
}
Queste sono le operazioni da compiere, non ci soffermiamo piu’ di tanto sulle classi da dove provengono e le sottoclassi perche’ entreremo in un tecnicismo abbastanza incomprensibile e abbastanza inutile dato che queste operazioni cambiando poi i nomi normalmente si fanno quasi con dei copia incolla, insomma sono standard.
Facciamo notare solamente la creazione dell’oggetto OleDbDataAdaper, il quale altro non è che un canale di comunicazione di dati , attraverso il quale s’inolta il comando TSQL alla connessione che sta puntando all’applicazione stessa.
Ora che abbiamo visto i DataSet passiamo a descrivervi i DataReader
Un DataReader si qualifica in uno strema di record di tipo forward only, il quale premette la lettura di un singolo record per vola. Questa tecnica di connessione si dice “Connessa”, in quanto durante la lettura con un oggetto DataReader, la connessione a essa associata resta occupata.
E’ sicuramente uno strumento affidabile, l’oggetto DataReader non tiene in memoria alcun tipo di valore, ne durante la lettura e tantomeno l’inizio di parametri di output.
vediamo come funziona nello specifico.
OleDbConnection mdbConnection = new OleDbConnection (“Provider = Microsoft.Jet.OleDb.4.0; Data Source = C:\\site\db.mdb”);
//si ricontrolla il buon andamento della connessione.
try {
mdbConnection.Open();
}
catch (Exception Ex)
{
Response.Write( “Impossibile Aprire una connessione con il database”);
}
OleDbCommand _OleCmd = new OleDbCommand ( “Select * from Utenti”, mdbConnection);
System.Data.OleDb.OleDbDataReader dr = _OleCmd.ExecuteReader();
//se il risultato della query contiene dei valori
if (dr.HasRows)
{
while (dr.Read())
{
Response.Write (“utente “+ dr[“Nome”] + ” ” + dr[“Cognome”] + “<br>”) ;
}
}
//Come sempre a questo punto si chiude la connessione
if (mdConnection.State != System.Data.ConnectionState.Closed)
{
mdbConnection.Close();
}
Vi vogliamo fare soppesare l’attenzione su un comando che abbiamo introdotto in questa pagina ossia HasRow, per chi gia’ conoscesse da altri linguaggi EOF il problema è risolto, anche se MicroSoft lo spaccia come una novità tutta sua , in soldoni si tratta della stessa cosa. per gli altri si tratta semplicemente di una variabile che interagisce con il database ogni volta che si effettua la lettura di un record dal database e quando non sono presenti altri recordi viene caricata al valore booleano di false.
OleDbConnetcion mdbConnection = new OleDbConnection (” Provider = Microsoft.Jet.OleDB.4.0; Data Source = C:\\site\db.mdb”);
// si controlla il buon esito dell’apertura del db
try
{
mdbConnection.Open();
}
catch (Exception Ex)
{
Response.Write (“Impossibile aprire una connessione con il database”);
}
// E per la chiusura si ha
if (mdbConnection.State != System.Data.ConnectionState.Closed)
{
mdbConnection.Close();
}
Oggetto Command
L’oggetto Command viene utilizzato per spedire dei comandi di tipo TSQL (Quelli che abbiamo visto fino ad adesso ) al nostro database di riferimento e opera soltanto quando la variabile state che abbiamo incontrato nel nostro ultimo if ha il valore di true. Sono in pratica dei comandi che ci possono tornare utili nella nostra fase di analisi. L’oggetto Comamand nativamente implementa i seguenti 4 metodi
- ExecuteNonQuery() numero di righe che sono coinvolte nell’operazione
- ExecuteScalar () primo valore della colonna prima di sinistra
- ExecuteReader () viene utilizzato per compilare un oggetto di tipo Data Reader
CommandBehavior
Questi CommandBehavior forniscono dei risultati della query e dei relativi effetti sul database in cui vengono lanciati i comandi SQL
Gli Eventi
Si definisce un evento il verificarsi di una ben determinata condizione, per esempio un evento potrebbe essere il clic di un bottone presente all’interno di un form.
Gli eventi sono perlopiù nella classe Pagge e sono i seguenti
Eventi di Page |
|
PreInit | Si verifica nel momento in cui la pagina viene richiesta |
Init | Si verifica quando la pagina si vuole inizializzare |
InitComplete | Evento che si verifica quando termina Init |
PreLoad | Si verifica quando tutti i dati sono stati richiesti e organizzati |
Load | Evento che gestisce il caricamento dei dati |
PostBack | Si Verifica quando è necessaria una rielaborazione della pagina a partire dai dati combinati |
PreRendering | Inizio traduzione di rende ring ossia il server converte il codice in linguaggio Html
|
Unload | Si è terminato il tutto e si fanno le verifiche sul buon esito del caricamento |
Page Postback e Page CrossoPage Postback
Andiamo piu’ nel particolare , ma prima a chi provenisse a questa nuova tecnologia da altri linguaggi facciamo notare una peculiarità , siamo ormai alla fine e ancora non ci è capitato di imbatterci nel form GET e POST, vi assicuriamo che non si tratta di una dimenticanza, ma di una precisa scelta di Microsoft ASPNET , per dire la verità anche abbastanza cervellotica, perche’ se invece di prendere il Visual Web Developer Express Edition con motore ASPNET 3.5, ma prendessimo il Visual C# ritroveremmo i nostri buoni GET e POST. Cmq senza perderci in tanti sofismi da ASPNET 1.0, nonostante la guerra fatta dai programmatori nei newgroup, il passaggio di parametri tramite il metodo GET e POST è stato abolito. Altre sono le tecniche che sono state introdotte prima fra tutte il POSTBACK, questo evento si verifica quando si invia dei dati alla stessa pagina, si verifica un evento definito appunto Post Back, ossia invio ed elaborazione dei dati da parte della stessa pagina. Per fare questo si effettua un controllo sulla pagina al momento del suo caricamento che è il seguente.
protected void Page_Load (object sender, EventArgs e)
{
if (Page.IsPostBack
{
//blocco di istruzione da eseguire
}
}
E novità delle novità Aspnet 3.5 ha introdotto anche il CrossPagePostBack
CROSSPAGE POSTBACK
Ossia adesso attraverso questo comando è possibile l’indio dei dati a pagine esterne in soli due passaggi
- Specificazione della proprietà PostBackUrl nel pulsante del controllo che la utilizza
- Specificazione che se fatta dalla progettazione per esempio del VWD da luogo a questo codice per esempio
<form runat=”server”
<asp:textbox runat =”server” id =”Nome” />
<asp:button runat =”server” id =”BotttoneInvioDati”
Text =”invia” PostBackUrl =”/pippo.aspx”/>
</form>
Ovviamente in fase di rendering , ossia di trasformazione di linguaggio in Html per essere poi spedito al nostro browser vedremo delle cose abbastanza differenti.
ViewState
Veniamo a questo comando , che onestamente credo che abbiamo utilizzato giusto una volta per prova , ma a cui Mircrosoft ripone veramente grande fiducia.
E’ un comando, che è molto in odore di Java , anche se poi Microsoft lo ha riutilizzato sia per il Visual Basic che per il C e serve per il mantenimento dei dati persistenti. In pratica consente di antere i dati inseriti all’interno dei controlli ancora visibili, dopo eventuali reload della pagina in cui si è verificato l’evento di tipo Postback
la sua sintassi è la seguente
Value = ViewState (key)
anche se è possibile disabilitarlo direttamente inserendo la direttiva
<%@ Page EnableViewState =”False” %>
inoltre è molto facile da decodificare e quindi pessimi per la sicurezza, in parole molto povere fino a quando Microsoft non lo renderà un minimo piu’ efficace ci sono sempre i buoni e vecchi cookie di sessione che funzionano benissimo nonostante la loro anzianità di servizio.
Data Base Repository
Con l’avvento degli hacker, cracker etc. etc. la sicurezza informatica sta sempre riscuotendo maggiore attenzione per quanto riguarda la programmazione, vi sarà sicuramente capitato di accedere a dei siti web che richiedevono l’introduzione di password, ecco quello si trattava senza ombra di dubbio di un ambiente Apache, vediamo adesso il corrispettivo di IIS di Microsoft.
Dentro il File Web.Config è inserito un siteMap di protezione del tipo
<add path =”*.xml” verb =”*”
type = “System.Web.HttpForbiddenHandler” validate = “true” />
Con questa tecnica in pratica è applica a tutte le cartelle “riservate ” di Aspnet, cioe’ nessun utente web avrà mai la possibilità di accedervi e vederle. E’ sicuramente una soluzione all’avanguardia. Questo tecnologia introdotta vi da anche un’idea ben precisa del grado di continua evoluzione a cui è sottoposta questa piattaforma, in assoluto la piu’ svilippata del web , rispetto anche ad altre di tipo open source.
Data Binding
Il DataBinding è una prodcedura di collegamento e non di recupero dati. Esistono due tipologie di Dati
DataBinding Semplice
Databinding Avanzato
Per semplice s’intende il collegamento di un singolo valore a una singola proprietà di un oggetto, derivante dalla classe Control, per esempio di una stringa di testo a un controllo TexBox. Facciamo subito un esempio
<body>
< form id =”form1″ runat=”server” >
<div> Orario i cui è stato effettuato il collegamento<br/>
<asp:TexBox ID=”Orario”
Text='<%#OrarioEntrata() %>’
runat=”server” />
</div>
</form>
</body>
e la relativa funziona
public string OrarioEntrata() {
stringOrario = System.DateTime.Now.ToString();
return Orario;
}
Il Controllo DataBinding si realizza con il controllo TextBox alla fonte OrarioEntrata
e si realizza nel seguente modo
protect void Page_Load (object sender, EventArgs e)
{
Orario.DataBind();
}
Nel momento in cui viene caricata al pagina il compilatore, notificando la richiesta di DataBinding effettua il controllo di associazione dell’oggetto TextBox, andando ad analizzare la proprietà che dovrà essere associata a una risorsa specificata a livello di codice. Questo è reso possibile dall’identificazione del costrutto <%# %> grazie a lui, la procedura viene avviata e tutto il contenuto richiesto viene caricato come specificato precedentemente.
Verrà ora creato il codice che permette l’associazione dell’informazione contenuta nella tabella Users del database Customers, nel controllo TextBox con ID Orario . quindi facciamo
<body>
<form id =”form1″ runat =”server”>
<div> Orario in cui è stato effettuato il collegamento <br />
<asp: TextBox ID=”Orario” Text='<%#OrarioEntrata() %>’ runat=”server” />
<br />
il tuo ultimo collegamento risale al
<asp:TextBox ID=”Last”
Text ='<%#LastOrario() %>’ runat =”server” />
</div>
</form>
</body>
e quindi avremo
public string LastOrario()
{
string sql =”Select TOP 1 lastlogin form Users where username =’mario.rossi’ order by ID desc”;
SqlConnection UConn = new SqlConnection (@”DataSource=.\SQLESPRESS;AttachDbFilename=C:\Documents and Settings\alessio\Documenti\Visual Studio 2055\PochetNet\App_Data\UserDatas.mdf; Integrated Security = True; User Istance =Tre”);
string result = string.Empty;
SqlDataReader Reader;
SqlCommand Cmd =new SqlCommand (sql, UConn);
if (UConn.State != System.Data.ConnectionState.Open
{
UConn.Open();
}
Reader = Cmd.ExecuteReader (CommandBehavior.SingleResult | CommandBehavior.CloseConnection );
if (Reader.HasRows)
{
while (Reader.Read())
result = Reader.GetDateTime().ToString();
;
} else
{
result = “nessun login registrato”;
}
UConn.Dispose);
return result;
}
Come per tutte le operazioni di DataBinding è necessario ricordare di lanciare l’intero processo chiamando il metodo DataBind() dell’oggetto Last nel metodo Page_Load
protect void Page_Load (object sender, EventArgs e)
{
Orario.DatbIND();
Last.DataBind()
}
LABEL
CAMBIA IL TESTO MOSTRATO A VIDE SI VALORIZZA CON le seguenti proprietà
BackColor, BorderColor, BorderStyle, CssClass, ForeColor, Text, ToolTipip, Visible , Enable Theming
il codice che lo implenta +
<asp:Label id=”PrimoLabel”
Text =”il mio primo controllo Label ” runat =”server”
/>
CONTROLLO HyperLink
Attraverso questo controllo è possibile creare elementi ipertestuali le proprietà sono grosso modo le teste e il codice che implementa è
<asp:HyperLink id=”PrimoHyperLink” Text =”HomePage”
NavigateUrl=”home.aspx” runat =”server”
/>
CONTROLLO TEXTBOX
Il Comando TextBox puo’ trasofrmasi in un elemento textarea in semplice controllo di input.Fra le sue piu’ importanti proprietà ci volgiamo pero’ soffermare su due
ReadOnly Abilita/Disabilita la possibilità di cambiare il testo contenuto nel controllo
AutoPostBack Se valorizzato a true , scatena un evento PostBack ogni qual volta che si modifica il contenuto del controllo stesso
CONTROLLO BUTTON
L’elemento di unput generato da questo contrololo, in fase di rendering è di tipo submit pertanto facendo clic , verra automaticamente, inviato al seriver il form nel qual il controllo era contenuto
<asp: Button ID=”PrimoBottone”
runat=”server”
Text=”Invia”
OnClick =”ComputeHash”
/>
Il metodo void ComputeHash() è ora associato al controlloo Button e verrà eseguito nel momento in cui l’utente effettuerà un clic sul pulsante appena creato
protected void ComputeHash (object sender, EventArgs e)
{
Response.Write(“Richiesta Effettuata”);
}
Controllo BulletList
Utilizzato maggiormente per mostrare elenchi di elementi
<asp:BulletdList id =”PrimBulletList”
runat=”server”>
<asp:ListItem>
Mini One D
</asp:ListItem>
<asp:ListItem>
MiniOne
</asp:ListItem>
</asp:BulletedList>
LINQ
Linq è l’acronimo di Language Integrated Query, in parole molto semplice con lo stesso codice è possibile elaborare ed effettuare query su diverse fonti di dati
Il cuore di LINQ è composto di una serie di API che spiccano come un obtecta model possa essere interrogato, queste API si occupano di gestire e rendere fruibili metodologie d’interrogazioni gia’ conosciute.
Gli Elementi di LINQ
/server Indica il nome del server
/database indica il nome del database
/user:<name> indica la username con cui collegarsi al database
/password indica la password associata al valore di user
/contex:<type) il nome della classe di defautl viene utilizzato il nome del database a cui si desidera collegarsi
/serialization:<opzioni> Genera classi serializzabili, le opzioni disponibili da associare a l comando sono nome e Unidirectional
Programmare LINQ
Al fine d’integrare LINQ all’interno de framework net sono state aggiunte deu nuove parole chiave che sono rispettivamente
var
from
a queste sono state associate una lista di keyword che le vanno a comporre
where
orderby
in
join
group
select
vediamo subito un primo esempio per il momento senza utilizzare il database.
Class program {
static void Main (string[] args)
{
int [] nums = {
5,4 , 3, 2, 1,
};
var AddOne = from n in nums select n +1;
foreach (var i in addOne) {
Console.WriteLine(i);
}
Console.ReadKey();
}
}
Se per esempio vogliamo selezionare solo i valori inferiori a 5 ed in ordine decrescente dobbiamo fare
Class program {
static void Main (string[] args)
{
int [] nums = {
5,4 , 3, 2, 1,
};
var AddOne = from n in nums
where n<5
orderby n descending
select n +1;
foreach (var i in addOne) {
Console.WriteLine(i);
}
Console.ReadKey();
}
}
Collegamento LINQ a Database
Vediamo adesso come rendere possibile il collegamento al database desiderato utilizzando il seguente codice
using System:
using System.Linq;
using System.Data.Linq;
using nwind;
Nortwind db =new Northwind (@ “Data Source=\SQLEXPRESS; Initial Catalog = NorthWind”);
var custs = from c in db.Customers
where c.City== “London”
select c;
foreach (var cust in custs) {
Console.WriteLine (“{0}”, cust.CompanyName);
}
A questo punto è possibile fare le query a Database
Vediamo tutte le possibili opzioni che permette il Linq
Linq to Objects | esegue delle query su array che sono presenti in memoria |
Linq to XML | permette di accedere a XML utilizzando i Doom |
Linq to DataSet | permette appunto a LINQ di operare tramite i DataSet |
Linq to Sql | Con questo sistema si permette a LINQ di accedere a SQL SERVER |
Linq to Entites | scollega il database da un qualsiasi object model |
Lambda Expression , Expression Tree
Il linguaggio LINQ è stato introdotto grazie alle specifiche di tre linguaggi che sono stati integrati, linguaggi e metodi di programmazione per la precisione.
Lambda Expression
Le espressioni Lambda esistono dal 1930 e sono dovute al merito del Matematico Alonzo Church. Si basano sul lettore lambda
=>
che letteralmente significa vai a. Il lato sinistro dell’operatore lambda specifica i parametri di input se presenti e il lato destro consente l’espressione o il blocco di istruzioni, facciamo subito un esempio pratico. L’espressione lambda
x => x * x
si legge x fino a x per x
facciamo un esempio chiarificatore di quanto queste espressioni semplifichino la vita del programmatore supponiamo di avere in cs i seguenti tre delegate
delegate int Sum( int a , int b);
delegate T MyFunc <T> (T a, T b);
delegate void InvokeMethod();
se si volesse aggiungere la somma di due valori a questo punto in cs dovremmo fare
Sum sd0= new Sum (CalcSum);
sd0=CalcSum;
int val =sd0(4,5);
private int CalcSum (int a, int b)
{
return a+b; 3:;
}
e grazie appunto l’introduzione dei Lambda il tutto diventa riassumibile come
Sum sd0= (int a, int b) => { return a+b;
}
Expression Tree
Una lambda espression viene definita attraverso le Expression Tree cioe’ le classi Expression <T> , vediamo subito come attraverso un esempio
Ripartiamo dall’esempio fatto sopra
Sum sd0= (a,b) => (a+b);
Per utilizzarla attraverso le expression tree il codice diventa
Expression<Func<int, int, int>> expression =(a,b) => a+bM
ret =expression.Compile()(4,5)
Partial Method
Le partial method di fatto le abbiamo incontrare sempre durante questa nostra esperienza in aspnet e si tratta di uno dei metodi piu’ vincenti della tecnologia di questo framework
Ossia da Aspnet 2.0 in poi è possibile separare in fiel diversi l’implementazione di una classe marcandola per l’appunto con l’attributo partial in questo modo avremmo due classi con lo stesso nome che vengono lette dal complilatore come un’unica classe, alleggerendo cosi’ la complessità per il programmatore, guardiamo subito come:
partial class Cliente {
string _name;
string Name
{
get {
return_name;;
}
set {_name= value;
}
}
Dopo possiamo tranquillamente aggiungere altre informazioni in un altro file
partial class Cliente {
string GetXYZ {
Codice aggiuntivo
}
}
Introduzione User Control e Validazione
Abbiamo finora visto come inserire i valori in un capo e come farli leggere tramite postback o callback, facciamo adesso un passo indietro e vi parliamo di Validator Control ossia che il valore che un’utenza potrebbe immettere nel campo non sia errato a priori, quindi per esempio stiamo parlando di un invio con un campo vuoto che pero’ è richiesto, oppure l’inserimento di una data sbagliata, tipo il 32 del mese e cosi’ via.. Ma prima guardiamo alcuni comandi server. Diciamo subito che per comandi server si intende quei comandi che alla loro esecuzione rimandano il loro completamento nel server
per esempio se abbiamo il comando server textbox abbiamo tre possibili modi di utilizzo normale, password e multilinee, provate infatti a inserire sulla pagina asp di default il seguente codice e date invio
<%@ Page Language=”C#” AutoEventWireup=”true” CodeBehind=”Default.aspx.cs” Inherits=”users._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>
<asp:Label ID=”Label1″ runat=”server” Text=”Label”></asp:Label>
<br />
<br />
<asp:TextBox ID=”TextBox1″ runat=”server”></asp:TextBox>
<br />
<br />
<br />
<asp:TextBox ID=”TextBox2″ runat=”server” TextMode=”Password”></asp:TextBox>
<br />
<br />
<asp:TextBox ID=”TextBox3″ runat=”server” TextMode=”MultiLine”></asp:TextBox>
</div>
</form>
</body>
</html>
Vediamo adesso un esempio con autopostback ossia facendo ritornare i valori che inseriamo da testiera alla stessa pagina web del server che li ha generati, vediamo un esempio con un bottone ed un esempio per spiegarci meglio
proviamo ad inserire nella default questo codice
<%@ Page Language=”C#” AutoEventWireup=”true” CodeBehind=”Default.aspx.cs” Inherits=”users._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>
<asp:Label ID=”Label1″ runat=”server” Text=”Label”></asp:Label>
<br />
<br />
<asp:TextBox ID=”TextBox1″ runat=”server” AutoPostBack=”True” OnTextChanged=”operazione1″></asp:TextBox>
<br />
<br />
<br />
<asp:Button ID=”Button1″ runat=”server” OnClick=”operazione2″
Text=”Button” />
<br />
<br />
</div>
</form>
</body>
</html>
e nella relativa pagina cs del default il seguente codice con le due operazioni 1 e 2 che si attiveranno al momento che il testo verrà cambiato o che il bottone verrà digitato
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace users
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void operazione2(object sender, EventArgs e)
{
Response.Write(“Tasto digitato”);
}
protected void operazione1(object sender, EventArgs e)
{
Response.Write(“testo cambiato”);
}
}
}
ovviamente consigliamo di utilizzare il progetto e non inserire il codice in maniera cruda, come per semplicità abbiamo fatto noi in questo caso
Una possibile variante del tasto Button che abbiamo appena visto potrebbe essere ImageButton, che ha la differenza che invece di inserire un buttone nel visuale mette un’immagine specificata nella proprietà ImageUrl.
Altro controllo server molto interessante è il DropDownList che in pratica permette di introdurre un valore fra n possibile valori predefiniti.
la cui sintassi potrebbe per esempio essere la seguente
<asp:DropDownList ID=”DropDownList1″ runat=”server” AutoPostBack=”True” OnSelectedIndexChanged=”operazione4″>
<asp:ListItem>quanti anni hai</asp:ListItem>
<asp:ListItem>alba chiara</asp:ListItem>
<asp:ListItem>E..</asp:ListItem>
<asp:ListItem>Il mondo che vorrei</asp:ListItem>
</asp:DropDownList>
a questo punto potete sbizzarrirvi voi a mettere gli eventuali incastri
per completezza vi facciamo vedere una possibile implementazione del listbox che visualizza a video una serie di possibili valori
<asp:ListBox ID=”ListBox1″ runat=”server”>
<asp:ListItem>Oggetto 1 </asp:ListItem>
<asp:ListItem>Oggetto 2 </asp:ListItem>
<asp:ListItem>Oggetto 3 </asp:ListItem>
<asp:ListItem>Oggetto 4 </asp:ListItem>
</asp:ListBox>
con la possibilità di fare una sola scelta per volta , oppure piu’ scelte nel seguente modo
<asp:ListBox ID=”ListBox1″ runat=”server” >
<asp:ListItem>Oggetto 1 </asp:ListItem>
<asp:ListItem>Oggetto 2 </asp:ListItem>
<asp:ListItem>Oggetto 3 </asp:ListItem>
<asp:ListItem>Oggetto 4 </asp:ListItem>
</asp:ListBox>
allo stesso modo funzionano anche gli altri comandi server control che trovate nella lista standard del visual web developer a voi .
Validazione
Vediamo adesso come funziona la Validazione dei dati, ossia il controllo di quello che inseriamo nella casella di testo dei nostri comandi server web. Faremo pochi ma significativi esempi. Iniziamo subito con la tabella che mostra quali sono i comandi a nostra disposizione.
Controllo Server |
Descrizione Controllo |
RequiredFieldValidator | garantisce che l’utente non abbia saltato un campo di input del form |
CompareValidator | Premette di confrontare l’input dell’utente con un ‘altra voce , utilizzando un operatore di confronto (uguaglianza, maggiore di , minore di, e cosi’ via) |
RangeValidator | Verifica l’input dell’utente in funzione di un intervallo di numeri o caratteri definito da un limite inferiore e superiore |
RegularExpressionValidator | Verifica che il dato dell’utente corrisponda a un patter definito da un’espressione regolare |
CustomValidator | Verifica che il dato dell’utente utilizzi una logica di convalida personalizzata |
ValidationSummary | Visualizza i messaggi di errore di convalida in una zona particolare della pagina |
cominciamo subito con un esempio chiarificatore, introduciamo una pagina di default aspx e introduciamo il seguente codice
<%@ Page Language=”C#” AutoEventWireup=”true” CodeBehind=”Default.aspx.cs” Inherits=”uservalidation._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>
<asp:TextBox ID=”TextBox1″ runat=”server”></asp:TextBox>
<br />
<br />
<asp:RequiredFieldValidator ID=”RequiredFieldValidator1″ runat=”server”
ErrorMessage=”RequiredFieldValidator” ControlToValidate=”TextBox1″ InitialValue=”Valore iniziale campo opzionale” ></asp:RequiredFieldValidator>
<br />
<br />
<br />
<asp:Button ID=”Button1″ runat=”server” Text=”Button” OnClick=”funzione1″ />
<br />
<br />
<asp:Label ID=”Label1″ runat=”server” Text=”Label”></asp:Label>
<br />
</div>
</form>
</body>
</html>
Come sempre vi consigliamo di farlo tramite la pagina progettazione del visual web developer al fine dopo avere trascinato i vari comandi , dovrete ottenere questa pagina di programmazione.
E il relativo cs che intercetta gli eventi diventa
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace uservalidation
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void funzione1(object sender, EventArgs e)
{
if (Page.IsValid) {
Label1.Text = “la pagina è valida”;
}
}
}
}
come potete vedere il controllo RequiredFieldValidaotor è associato al controllo del Textbox, al resto ci pensa il button che controlla tramite Page.IsValid se il campo di testo ha subito un cambiamento in quel caso da l’ok.
Analogamente si puo’ costruire uno script ad ok per verificare se in un dropdownlist il valore iniziale è stato modificato o meno in questo caso avremo
<asp:DropDownList ID=”DropDownList1″ runat=”server”>
<asp:ListItem>Seleziona una professione</asp:ListItem>
<asp:ListItem>Programmatore</asp:ListItem>
<asp:ListItem>Commercialista</asp:ListItem>
<asp:ListItem>Artista</asp:ListItem>
</asp:DropDownList>
<br />
<br />
<asp:RequiredFieldValidator ID=”RequiredFieldValidator2″ runat=”server”
ErrorMessage=”RequiredFieldValidator” ControlToValidate=”DropDownList1″ InitialValue=”Seleziona una professione”></asp:RequiredFieldValidator>
<br />
</div>
Come potete vedere il comportamento è nei due casi abbastanza analogo.
Passiamo adesso ad osservare il controllo di un altro Controllo Validator che si chiama CompareValidator, questo controllo permette di confrontare due elementi del form al fin e di stabilire se sono uguali, per esempio potrebbe essere il caso di quando vogliamo confrontare due password per chiederne una di conferma , in questo caso potrebbe essere il controllo ideale che fa al nostro caso. Vediamo subito un esempio.
<%@ Page Language=”C#” AutoEventWireup=”true” CodeBehind=”Default.aspx.cs” Inherits=”compare._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>
<asp:TextBox ID=”TextBox1″ runat=”server”></asp:TextBox>
<br />
<br />
<br />
<asp:CompareValidator ID=”CompareValidator1″ runat=”server”
ErrorMessage=”CompareValidator” ControlToValidate=”Textbox2″ ControlToCompare=”TextBox1″></asp:CompareValidator>
<br />
<br />
<br />
<br />
</div>
<asp:TextBox ID=”TextBox2″ runat=”server”></asp:TextBox>
<br />
<br />
<br />
<asp:Button ID=”Button1″ runat=”server” Text=”Button” Onclick=”funzione1″ />
<br />
<br />
<br />
<asp:Label ID=”Label1″ runat=”server” Text=”Label”></asp:Label>
</form>
</body>
</html>
e il relativo campo c sharp che intercetta il relativo codice e quindi abbiamo che:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace compare
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void funzione1(object sender, EventArgs e)
{
if (Page.IsValid) {
Label1.Text = “Password coincidenti”;
}
}
}
}
Vediamo adesso il controllo RangeValidator che è per sua natura molto simile al controllo Compare Validator, ma in questo caso si verifica che il valore o la selezione indicata dall’utente sia compresa in un intervallo specificato, in modo che risulti maggiore o minore di una determinata costante
<%@ Page Language=”C#” AutoEventWireup=”true” CodeBehind=”Default.aspx.cs” Inherits=”range_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>
<asp:TextBox ID=”TextBox1″ runat=”server”></asp:TextBox>
<br />
<br />
<asp:RangeValidator ID=”RangeValidator1″ runat=”server”
ErrorMessage=”RangeValidator” ControlToValidate=”TextBox1″ Type=”Integer” Text=”inserire valore compresi solo fra 30 e 40″ MaximumValue=”40″ MinimumValue=”30″></asp:RangeValidator>
</div>
</form>
</body>
</html>
come potete vedere il codice è abbastanza intuitivo e di facile comprensione, controlliamo adesso per esempio come sia possibile verificare l’esattezza di una email, ossia che sia in formato regolare utilizzando il controllo server RegularExpressionValidator. In pratica questo controllo permette di verificare l’input dell’utente rispetto a un pattern da definire utilizzando un’espressione regolare. Vediamo una sua possibile impetrazione
<asp:RegularExpressionValidator ID=”RegularExpressionValidator1″ runat=”server”
ErrorMessage=”RegularExpressionValidator” Text=”devi inserire un indirizzo di posta che sia valido”
ValidationExpression=”\w+([-+.’]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*”></asp:RegularExpressionValidator>
Dove la ValidationExpress è ottenuta impostando la giusta opzione nel campo dalla progettazione di visual web developer
Spesso e volentieri quando si programma si ha a che fare con pagine dove si deve immettere piu’ dati nei form, per esempio un ’email , una password , un username, insomma il sistema si troverebbe nell’imbarazzo di dovere gestire questo sistema con la reale possibilità di avere degli errori, tipo inseriamo un’email ma controlliamo il campo della password e cosi’ via, per ovviare a questo tipo di problemi, Aspnet 3.5 ha introdotto una nuova metodologia che si chiama ValidationGroup ossia ad ogni controllo server viene specificato a che gruppo appartiene in modo tale che non possa essere associato ad un altro gruppo che appunto cosi’ a un altro nome. Vediamo
<asp:RangeValidator ID=”RangeValidator1″ runat=”server”
ErrorMessage=”RangeValidator” ValidationGroup=”gruppo1″ ControlToValidate=”TextBox1″ Type=”Integer” Text=”inserire valori compresi solo fra 30 e 40″ MaximumValue=”40″ MinimumValue=”30″></asp:RangeValidator>
<br />
<br />
<asp:Button ID=”Button1″ runat=”server” Text=”Button” ValidationGroup=”gruppo1″/>
<br />
Analogamente se volessimo mettere un altro gruppo di controllo nella pagina dovremmo mettere un altro validation group e a questo punto le varie gerarchie sono rispettate.