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” %>
Scarica

Organizzazione del codice