Sistemi Informativi e Telemedicina Anno Accademico 2007‐2008 Prof. Mauro Giacomini Organizzazione del codice y Separazione codice‐contenuto y Code‐behind, dietro l’interfaccia in un qualsiasi linguaggio y Controlli Utente y Creazione di controlli specifici con relativa logica e riutilizzabili in più punti delle nostre applicazione y Creazione Componenti y Concentra la logica applicativa in elementi indipendenti dall’interfaccia utente Separazione codice – contenuto y Codice separato dall’interfaccia HTML y Codice in qualsiasi linguaggio y Necessaria la creazione di due file, uno per l’interfaccia e uno per la logica applicativa y Nell’interfaccia necessaria la direttiva Page che specifica il nome del file di codice e la classe usata y Es <%@ Page Language=“VB” Inherits=“Dati” CodeBehind=“dati.vb” %> Esempio_a (1) Imports Imports Imports Imports Imports System System.Web System.Data System.Data.SQLClient System.Web.UI.Page Code-behind: Definisce una classe Dati Con una funzione pubblica getData che legge dati da un DB e li restituisce all’interfaccia con un DataSet Public Class Dati Public Function getData () as DataSet Dim ds as DataSet Dim conn as SQLConnection Dim cmd as SQLDataAdapter conn = New SQLConnection (“server = MyServer; uid=sa;pwd=;database=pubs”) Esempio_a (2) cmd = New SQLDataAdapter (“SELECT * From Authors”, conn) ds = New DataSet () cmd.Fill (ds, “Autori”) return (ds) End Function End Class Esempio_a (3) <%@ Page Language=“VB” Inherits=“Dati” CodeBehind=“dati.vb” %> <script> Sub Page_Load (scr as Object, e as EventArgs) Dim ds DataSet ds = getData() dgAutori.datasource = ds.Tables(“Autori”).DefaultView dgAutori.DataBind() End Sub </script> Script che richiama il code-behind dell’esempio_a 1-2 Esempio_b (4) <form runat=“server”> <asp:textbox id=“txt” runat=“server” /> <asp:button id=“btn” onClick=“Scrivi” text=“Clicca” runat=Server” /> <asp:label id=“lbl” runat=“server”> </form> Testo HTLM di una form con un bottone il cui evento click è collegato alla procedura Scrivi dichiarata in un file code-behind Esempio_b (5) Imports Imports Imports Imports System System.Web System.Web.UI.WebControls System.Web.UI.Page Partial Class Eventi Public lbl as Label Public txt as TextBox Code-behind con una classe Eventi che gestisce con la procedura pubblica Scrivi, l’evento di click del bottone dell’interfaccia descritta in Esempio_b (4) Public Sub Scrivi (scr as Object, e as EventArgs) lbl.Text = txt.Text I controlli dell’interfaccia che devono End Sub End Class essere modificati in questa procedura, sono dichiarati come pubblici in una parte della classe non visibile al programmatore Esempio (6) <asp:button id=“btn” text=“Clicca” runat=Server” /> Public btn as button Public Sub Scrivi (scr as Object, e as EventArgs)_ Handles btn.Click lbl.Text = txt.Text End Sub Se si vuole un’interfaccia del tutto scollegata dal codice, si deve dichiarare il bottone nell’interfaccia senza dichiarare nell’interfaccia quale procedura gestirà il suo evento click. Il bottone viene quindi dichiarato come pubblico nel file del code-behind (parte nascosta) e la procedura deve esplicitamente di gestire (Handles) il click del bottone stesso. Controlli utente y Parte di pagina ASP.NET importata e usata da un’altra pagina ASP.NET y y y y y come se fosse con controllo server. Fondamentali per il riutilizzo del software e per partizionare le funzionalità in un’interfaccia web Ogni istanza di un controllo utente ha un suo proprio namespace in modo che uno stesso controllo utente può essere usato più volte, anche nella stessa pagina. Il linguaggio di programmazione è libero ed indipendente dal linguaggio usato nell’interfaccia I file di controlli utente contengono anche parti dell’interfaccia, sono salvati in file .ascx e possono anche avere il meccanismo del code‐ behind Devono essere integrati in altre form, quindi non devono contenere <head>, <body> o <form> Esempio di Controllo Utente <%@ Control Language="VB" %> <asp:TextBox id="txtNum" runat="server" /> <asp:RequiredFieldValidator id="txtNmValidator“ runat=" server" ControlToValidate="txtNum" ErrorMessage="Inserisci un valore" Display^"dynamic"> </asp:RequiredFieldValidator> <asp:RangeValidator id="txtNmRngValidator“ runat="server" ControlToValidate="txtNum" ErrorMessage="Inserire un valore compreso tra O e 99" Type="Integer" MinimumValue="O" MaximumValue="99" Display="dynamic"> </asp:RangeValidator> Esempio di Controllo Utente (2) <script Language="VB" runat="server"> Public Property Numero As Integer Get Return CInt (txtNum.Text) End Get Set txtNum.Text = Value.ToString() End Set End Property </script> y Contiene una casella di testo e due controlli di validazione y Casella di testo per inserire un valore obbligatorio numerico compreso da 0 e 99 y Visibili all’esterno solo gli oggetti Public (proprietà Numero che corrisponde al valore della proprietà Text della casella di testo) y Dentro alla direttiva Control possiamo inserire i comandi per gestire il code‐behind y <%@ Control Inherits=“Classe” Codebehind=“Classe.vb” %> Inserimento controllo y Un controllo utente è incluso con la direttiva <%@ Register TagPrefix=“myCtrl” TagName=“NumeroValido” _ src=“numero.ascx” %> y TagPrefix: definisce un namespace univoco per il controllo utente y TagName: nome del controllo y Src: file dove sta il controllo con l’eventuale percorso Uso controllo y Per posizionare sulla pagina una o più istanze del controllo: <myCtrl:NumeroValido id=“Numero1” runat=“server” /> <myCtrl:NumeroValido id=“Numero2” runat=“server” /> y Per accedere alle proprietà: lblSomma.Text = (Numero1.Numero + Numero2.Numero).ToString() y Per un valore predefinito <myCtrl:NumeroValido id=“Numero1” Numero = 10 runat=“server” /> Dichiarazione componente Namespace Nome_Componente Public Class Nome_Classe ….. End Class Public Class Nome_Classe_1 …. End Class End Namespace Esempio di dichiarazione di un componente Direttive per la compilazione L’assembly che si ottiene va posto nella directory reale collegata alla directory virtuale o in una directory /bin dentro di essa. vbc /t:library /out:componente.dll componente.vb vbc /t:library /out:componente.dll /r:System.Data.dll componente.vb Esempio Import System.Data Import System.Data.SqlClient Namespace DatiAziendali Public Class OrdiniClienti Public Function CaricaDati (conn As SQLConnection)_ as DataSet Dim daClienti as SqlDataAdapter = New SqlDataAdapter (“Select * From Clienti”, conn) Dim daOrdini as SqlDataAdapter = New SqlDataAdapter (“Select * From Ordini”, conn) Dim relClientiOrdini as DataRelation Dim ds as DataSet = New DataSet() Esempio (2) daClienti.Fill (ds, “Clienti”) daOrdini.Fill (ds, “Ordini”) relClientiOrdini = ds.Relations.Add (“ClientiOrdini”, ds.Tables(“Clienti”).Columns(“ID”), ds.Tables(“Ordini”).Columns(“IDCliente”)) return ds end Function end Class end Namespace Uso in code‐behind Import DatiAziendali Dim x as New OrdiniClienti ‘Senza import Dim x as New DatiAziendali.OrdiniClienti Dim ds DataSet ds= x.CaricaDati(Conn) Uso in aspx <%@ Import Namespace = “DatiAziendali” %>