[ASP.NET 2.0]: user control in VB e in C# nello stesso sito

Introduzione
Fin dall’uscita di Visual Studio 2005, mi ha affascinato la possibilità di utilizzare diversi linguaggi nello stesso progetto.
Il principio è semplice, ma allo stesso tempo geniale: dato che ogni parte del codice di un linguaggio viene tradotta in un linguaggio intermedio (MSIL), è possibile combinare sorgenti di linguaggi differenti, per esempio VB e C#, per creare un progetto unico.
Questo fatto agevola soprattutto i team composti da programmatori con diverse competenze e conoscenze, dove alcuni conoscono meglio C# e altri conoscono meglio VB, ma agevola anche il programmatore “solitario”, facilitandogli l’uso dei molti esempi e componenti già pronti disponibili su Internet.In questo articolo vedremo in modo estremamente semplice come si possono applicare questi principi anche alla programmazione web. Infatti in un sito web si possono utilizzare pagine scritte in linguaggi diversi, ma anche user control con la stessa caratteristica.

Il progetto è in sé banale: creiamo due user control, uno scritto in VB e uno, sostanzialmente identico, scritto in C# per la visualizzazione della data e ora del server web. Questi user control sono utili per verificare l’ora del server, magari quando il nostro sito è in hosting all’estero.

Creazione del progetto
Naturalmente la prima cosa da fare è creare una normale applicazione web:

  1. File/Nuovo sito web
  2. Selezionare “Sito web ASP.NET“, scegliere la cartella dove posizionare il progetto (per esempio C:\VB2005\UserControl) e scegliere il linguaggio predefinito (in questo articolo preferisco cominciare con VB);
  3. Alla conferma avremo la nostra pagina Default.aspx vuota: aggiungiamo alcune stringhe di testo, giusto per vedere qualcosa.

A questo punto la pagina web sarà così formata:

<%@ 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>Pagina senza titolo</title> 
</head> 
<body style="font-size: 12pt"> 
    <form id="form1" runat="server"> 
    <div> 
        <span style="color: darkorange; font-family: Verdana"> 
        <strong>HOME PAGE<br /> 
        </strong><span style="color: black"> 
            <br /> 
            Prova di controllo personalizzato con VB<br /> 
            <br /> 
            <br /> 
            <br /> 
            Prova di controllo personalizzato con C#<br /> 
            <br /> 
            <br /> 
        </span></span> 
    </div> 
    </form> 
</body> 
</html>

Creazione di uno User Control in VB
Procediamo ora alla creazione di uno user control con il linguaggio VB:

  1. nella finestra “Esplora Soluzioni“, fare clic con il tasto destro del mouse sul nome del progetto e selezionare “Aggiungi Nuovo Elemento…”;
  2. nella finestra di dialogo scegliere “Controllo utente web“, modificare il nome in “TimeVB.ascx” e, lasciando invariato il linguaggio (VB), confermare;
  3. fare doppio clic su “TimeVB.ascx” e inserire un controllo Label nella finestra di progettazione del controllo e modificare il suo ID in “LabelVB“.
  4. Nel file “TimeVB.ascx.vb“, invece, inserire il seguente codice:
Partial Class TimeVB 
    Inherits System.Web.UI.UserControl 
    Protected Sub Page_Load(ByVal sender As Object, _ 
            ByVal e As System.EventArgs) Handles Me.Load 
        Dim dt As DateTime = DateTime.Now 
        LabelVB.Text = String.Concat("Ora del server: ", dt.ToString) 
    End Sub 
End Class

Come è possibile vedere, abbiamo dichiarato una variabile dt di tipo DateTime, assegnandole la data e ora attuale. Subito dopo abbiamo assegnato alla proprietà Text della LabelVB la stringa composta da una stringa letterale e la data e ora convertita in testo con il metodo ToString.

Aggiungiamo ora il controllo nella pagina web: torniamo alla pagina Default.aspx, prendiamo con il mouse il file TimeVB.ascx e lo trasciniamo nella posizione voluta (cioè dopo la stringa “Prova di controllo personalizzato con VB” presente nella pagina).

Se a questo punto eseguiamo il progetto con F5, otterremo l’effetto voluto: abbiamo la nostra data e ora visualizzati nella pagina.

Creazione di uno User Control in C#
Procediamo nello stesso modo per creare lo user control in C#:

  1. nella finestra “Esplora Soluzioni“, fare clic con il tasto destro del mouse sul nome del progetto e selezionare “Aggiungi Nuovo Elemento…”;
  2. nella finestra di dialogo scegliere “Controllo utente web“, modificare il nome in “TimeCS.ascx” e, dopo aver modificato il linguaggio in “Visual C#“, confermare;
  3. fare doppio clic su “TimeCS.ascx” e inserire un controllo Label nella finestra di progettazione del controllo e modificare il suo ID in “LabelCS“;
  4. nel file “TimeCS.ascx.cs“, invece, inserire il seguente codice:
using System; 
using System.Data; 
using System.Configuration; 
using System.Collections; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
public partial class TimeCS : System.Web.UI.UserControl 
{ 
  protected void Page_Load(object sender, EventArgs e) 
  { 
    DateTime dt = DateTime.Now; 
    LabelCS.Text = string.Concat("Ora del server: ", dt); 
  } 
}

Anche questa volta aggiungiamo il controllo nella pagina web: torniamo alla pagina Default.aspx, prendiamo con il mouse il file TimeCS.ascx e lo trasciniamo nella posizione voluta (cioè dopo la stringa “Prova di controllo personalizzato con C#” presente nella pagina).

Eseguiamo nuovamente il progetto con F5 per verificare che entrambi i controlli, scritti in VB e in C#, funzionino correttamente.

Per differenziare le due versioni del controllo possiamo anche cambiare qualche proprietà dei controlli Label inseriti nei due controlli, magari cambiandone i colori, il font e quant’altro si desideri, così come ho fatto nell’esempio allegato a questo articolo.

La pagina default.aspx finale
Diamo ora uno sguardo alla pagina Default.aspx finale, dopo l’aggiunta dei due controlli utente:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" 
Inherits="_Default" %><%@ Register src="TimeCS.ascx" 
mce_src="TimeCS.ascx" TagName="TimeCS" TagPrefix="uc2" %> 

<%@ Register src="TimeVB.ascx" mce_src="TimeVB.ascx" TagName="TimeVB" TagPrefix="uc1" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head id="Head1" runat="server"> 
    <title>Pagina senza titolo</title> 
</head> 
<body style="font-size: 12pt"> 
    <form id="form1" runat="server"> 
    <div> 
        <span style="color: darkorange; font-family: 
        Verdana"><strong>HOME PAGE<br /> 
        </strong><span style="color: black"> 
            <br /> 
            Prova di controllo personalizzato con VB<br /> 
            <uc1:TimeVB ID="TimeVB1" runat="server" /> 
            <br /> 

            <br /> 
            <br /> 
            Prova di controllo personalizzato con C#<br /> 
            <uc2:TimeCS ID="TimeCS1" runat="server" /> 
            <br /> 
            <br /> 
        </span></span> 
    </div> 
    </form> 
</body> 
</html>

Ci sono due elementi da notare: il primo è che sono state aggiunte due direttive per la registrazione dei due controlli che abbiamo aggiunto alla pagina:

<%@ Register src="TimeCS.ascx" mce_src="TimeCS.ascx" 
    TagName="TimeCS" TagPrefix="uc2" %> 
<%@ Register src="TimeVB.ascx" mce_src="TimeVB.ascx" 
    TagName="TimeVB" TagPrefix="uc1" %>

mentre il secondo è costituito dai due tag che inseriscono ciascun controllo utente nella posizione della pagina che abbiamo stabilito:

<uc1:TimeVB ID="TimeVB1" runat="server" /> <uc2:TimeCS ID="TimeCS1" runat="server" />

Conclusioni
I controlli utente che abbiamo creato sono estremamente banali, ma l’obiettivo di questo articolo era quello di mostrare come si crea e si inserisce un controllo utente e come possono essere create delle parti dell’applicazione web scritte in linguaggi differenti.

Un’altra particolarità interessante dei controlli utente è il fatto che nella finestra di progettazione del controllo stesso possono essere inseriti più “controlli-base”. Per esempio possono essere inseriti una Label, una Textbox e un ListBox: in questo caso il controllo utente sarà un controllo composto da tutti i controlli che sono stati inseriti al suo interno, semplificando il riutilizzo di componenti complessi (per esempio un controllo per inserire in un colpo solo un “form” di login). Questa possibilità, estremamente semplice da provare, non è mostrata in questo esempio ma viene lasciata come esercizio al lettore.

L’esempio è scaricabile da qui.

#15 Ricerca del primo ed ultimo giorno del mese

Queste 2 funzioni, abbastanza simili, calcolano rispettivamente la data del primo giorno e dell’ultimo giorno del mese.
I valori restituiti sono 2:

  • PrimoGiornoDelMese e UltimoGiornoDelMese restituiscono una stringa contenente il nome del giorno della settimana
  • i parametri dataPrimoGiorno e dataUltimoGiorno passati per riferimento vengono modificati per restituire la corrispondente data del primo e dell’ultimo giorno
  Public Function PrimoGiornoDelMese(ByVal data _ 
          As Date, ByRef dataPrimoGiorno As Date) As String 
  ' Parametri di input: 
    ' - data:            una data di riferimento per i calcoli 
    ' - dataPrimoGiorno: parametro passato per riferimento e 
    '                    modificato dalla funzione 
    ' 
  ' Parametri di output: 
    ' - PrimoGiornoDelMese: stringa contenente il nome del primo 
    '                       giorno del mese 
    ' - dataPrimoGiorno:    data del primo giorno del mese 
    
    Dim numeroGiornoSettimana As Integer 
    ' creazione array con nomi della settimana: 
    Dim nomiGiorniSettimana As String() = 
        ("Domenica", "Lunedì", "Martedì", _ 
        "Mercoledì", "Giovedì", "Venerdì", "Sabato"}    

    ' conversione della data da formato stringa (gg/mm/aaaa) a 
    ' formato DateTime 
    dataPrimoGiorno = 
        DateTime.Parse("01/" & data.Month & _ 
            "/" & data.Year)    

    ' calcolo del numero del giorno della settimana (da 0 a 6) 
    numeroGiornoSettimana = dataPrimoGiorno.DayOfWeek 
    
    ' estrazione del nome del giorno della settimana in base al 
    ' numero calcolato nell'istruzione precedente 
    PrimoGiornoDelMese = nomiGiorniSettimana(numeroGiornoSettimana) 
    
  End Function 
  Public Function UltimoGiornoDelMese(ByVal data _ 
          As Date, ByRef dataUltimoGiorno As Date) As String 
  ' Parametri di input: 
    ' - data:             una data di riferimento per i calcoli 
    ' - dataUltimoGiorno: parametro passato per riferimento e 
    '                     modificato dalla funzione 
    ' 
  ' Parametri di output: 
    ' - UltimoGiornoDelMese: stringa contenente il nome dell'ultimo 
    '                        giorno del mese 
    ' - dataUltimoGiorno:    data dell'ultimo giorno del mese 
    
    Dim numeroGiornoSettimana As Integer 
    ' creazione array con nomi della settimana: 
    Dim nomiGiorniSettimana As String() = _         
        {"Domenica", "Lunedì", "Martedì", _ 
        "Mercoledì", "Giovedì", "Venerdì", "Sabato"} 
                                            
    ' conversione della data da formato stringa (gg/mm/aaaa) a 
    ' formato DateTime 
    dataUltimoGiorno = _ 
        DateTime.Parse(data.DaysInMonth(data.Year, _ 
            data.Month) & "/" & data.Month & "/" & data.Year) 
                                      
    ' calcolo del numero del giorno della settimana (da 0 a 6) 
    numeroGiornoSettimana = dataUltimoGiorno.DayOfWeek 
    
    ' estrazione del nome del giorno della settimana in base al 
    ' numero calcolato nell'istruzione precedente 
    UltimoGiornoDelMese = _ 
        nomiGiorniSettimana(numeroGiornoSettimana) 
  End Function

Per testare le funzioni di cui sopra, questo è del codice che può essere inserito nell’evento Load di una form o nell’evento Click di un pulsante:

  Dim dataPrimoGiorno As Date 
  Dim dataUltimoGiorno As Date    

  ' calcolo il nome e la data del primo e dell'ultimo giorno 
  ' di Maggio 2008 
  System.Windows.Forms.MessageBox.Show("" & _       
      PrimoGiornoDelMese(#5/17/2008#, _ 
      dataPrimoGiorno) & " " & dataPrimoGiorno) 
  System.Windows.Forms.MessageBox.Show("" & _ 
      UltimoGiornoDelMese(#5/17/2008#, _ 
      dataUltimoGiorno) & " " & dataUltimoGiorno)    

  ' calcolo il nome e la data del primo e dell'ultimo 
  ' giorno di Marzo 2008 
  System.Windows.Forms.MessageBox.Show("" & _ 
      PrimoGiornoDelMese(#3/19/2008#, _ 
      dataPrimoGiorno) & " " & dataPrimoGiorno) 
  System.Windows.Forms.MessageBox.Show("" & _ 
      UltimoGiornoDelMese(#3/19/2008#, _ 
      dataUltimoGiorno) & " " & dataUltimoGiorno)