July 2010 - Post
Finalmente il coutndown sta per finire: domenica 1 agosto partenza per l’Inghilterra, destinazione Reading! Ci sono già stato l’anno scorso e ci torno con grande piacere quest’anno in compagnia della mia sorellina che insieme a me seguirà un corso di inglese sul posto! Ma non sarà solo studio naturalmente, so già che ci divertiremo un sacco! E poi devo rimediare a una grossa mancanza dell’anno scorso: a Reading c’è una sede Microsoft… ma io non lo sapevo!!!!! Andrò sicuramente a darci un occhio!

Waterstone quest’anno non avrà lo stesso fascino dell’anno scorso a causa del nuovo ebook reader (Onyx Boox 60) che ho comprato, ma sicuramente non mancherò di ritornarci! Chiunque di voi si trovasse in zona me lo faccia sapere che ci incontriamo sicuramente! Tornerò il 30 Agosto carico per un nuovo anno lavorativo pieno zeppo di attività, eventi, viaggi e anche qualche sorpresa!!!
Buone ferie a tutti voi, ci rivediamo a settembre!!!!!
-- Michele
Ritornando a parlare di certificazioni, una volta sostenuto l’esame propedeutico, il 70-536, che ci qualifica come MCP, è possibile cominciare a sostenere gli esami specifici delle varie tecnologie. Per Asp.NET 3.5 l’esame corrispondente è il 70-562. La scheda ufficiale dell’esame la trovate a questo link:
http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-562&locale=en-us
Il testo ufficiale per prepararsi a questo esame è il MCTS Self-Placed Training Kit (Exam 70-562): Microsoft .NET Framework 3.5 - ASP.NET:

Anche per questo esame avete 4 ore, le domande a cui rispondere sono 45 e la procedura è la stessa del primo esame. Il libro è scritto molto bene (naturalmente la versione in inglese)ed è molto chiaro su alcuni aspetti un po’ complessi di asp.net come la Microsoft Ajax Library e la creazione di custom control. Vale sempre la stessa regola degli esami universitari: non studiate per l’esame in se ma per la vostra cultura personale, il superamento dell’esame è una ovvia conseguenza.
Consiglio fortemente di fare gli esercizi e i lab suggeriti dal testo: per chi non usa questa tecnologia tutti i giorni è un buon modo per fare pratica ed acquisire quella familiarità necessaria a realizzare applicazioni web di successo e a superare a pieni voti (il minimo è sempre 700 su 1000) l’esame!
Aiutando un amico di dotnetcampania a risolvere un problema con l’interrogazione di un web service mi è venuta l’idea di fare un post che spieghi le differenze tra Web Application e Web Site che, nonostante sia un tema trattato e ritrattato, è meglio sviscerare ancora una volta.
Cercando in rete fortunatamente si viene facilmente rediretti alla pagina di msdn che spiega nel dettaglio le differenze:
http://msdn.microsoft.com/en-us/library/aa730880(VS.80).aspx
Aggiungo alla lista proprio la soluzione al problema dell’amico: se aggiungete una web reference a un servizio web nel caso della web application vedrete nella cartella anche il proxy generato e quindi potete eventualmente modificarlo, nel caso del web site questo non succede:
Inversamente nel secondo caso avete supporto pieno per la cartella App_Code (che non uso mai…) e le altre varie cartelle speciali:

Mentre nel primo nonostante il tutto funzioni creando una cartella chiamata App_Code e inserendoci codice all’interno non avrete supporto da parte dell’ambiente di sviluppo:

-- Michele
E stata da poco resa disonibile la prima preview di asp.net mvc 3 che potete scaricare qui:
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=cb42f741-8fb1-4f43-a5fa-812096f8d1e8#Overview
Le novità di questa versione sono:
- Razor Syntax View Engine.
- Dynamic View and ViewModel properties.
- "Add View" Dialog Box Supports Multiple View Engines.
- Service Location and Dependency Injection Support.
- Global Filters.
- New JsonValueProviderFactory Class.
- Support for .NET Framework 4 Validation Attributes and IValidatableObject.
- New IClientValidatable Interface.
- Support for .NET Framework 4 Metadata Attributes.
- New IMetadataAware Interface.
- New Action Result Types.
- Permanent Redirect
Buon download!
-- Michele
Tutti i programmatori asp.net sanno che il framework che usano è basato principalmente su due concetti, Postback e Viewstate, che forniscono un modello di sviluppo “simile” in apparenza allo sviluppo windows form ma completamente diverso dal punto di vista architetturale. E’ possibile in alcuni scenari fare in modo che il postback scatenato da un controllo in una pagina sia rediretto verso una pagina diversa: si parla in questo caso di cross-page postback e si può ottenere facilmente impostando la proprietà PostBackUrl del controllo che deve scatenare l’azione alla pagina di destinazione:
1: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication6.WebForm1" %>
2:
3: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4: <html xmlns="http://www.w3.org/1999/xhtml">
5: <head runat="server">
6: <title></title>
7: </head>
8: <body>
9: <form id="form1" runat="server">
10: <div>
11: <asp:textbox ID="MyTextBox" runat="server" />
12: <asp:button ID="MyButton" text="Invia" runat="server" PostBackUrl="~/WebForm2.aspx" />
13: </div>
14: </form>
15: </body>
16: </html>
La pagina di destinazione può, attraverso la proprietà PreviousPage, accedere ai controlli della pagina chiamante:
1: using System;
2: using System.Web.UI.WebControls;
3:
4: namespace WebApplication6
5: {
6: public partial class WebForm2 : System.Web.UI.Page
7: {
8: protected void Page_Load(object sender, EventArgs e)
9: {
10: if (PreviousPage != null)
11: {
12: TextBox myTextBox = PreviousPage.FindControl("MyTextBox") as TextBox;
13: if(myTextBox != null)
14: this.MyLabel.Text = myTextBox.Text;
15: }
16: }
17: }
18: }
Ottenendo un risultato in alcuni scenari (sicuramente non il nostro esempio…) molto comodo:
Volendo è possibile anche in questo caso fare a meno del FindControl e tipizzare la property PreviousPage come abbiamo fatto per la Master:
Ci basta quindi, nel nostro esempio aggiungere la direttiva PreviousPageType indicando WebForm1:
1: <%@ PreviousPageType TypeName="WebApplication6.WebForm1" %>
Ed esporre pubblicamente il controllo che ci interessa con una property (sempre per la questione che sono protected):
1: using System.Web.UI.WebControls;
2:
3: namespace WebApplication6
4: {
5: public partial class WebForm1 : System.Web.UI.Page
6: {
7: public TextBox WebForm1TextBox { get { return this.MyTextBox; } }
8: }
9: }
A quel punto possiamo scrivere:
1: using System;
2:
3: namespace WebApplication6
4: {
5: public partial class WebForm2 : System.Web.UI.Page
6: {
7: protected void Page_Load(object sender, EventArgs e)
8: {
9: if (PreviousPage != null)
10: {
11: this.MyLabel.Text = PreviousPage.WebForm1TextBox.Text;
12: }
13: }
14: }
15: }
Ed ottenere lo stesso risultato.
-- Michele
Quanti di voi hanno avuto la necessità di accedere dal code-behind di una pagina aspx ad un controllo presente nella masterpage legata alla pagina? Immagino molti. La soluzione più intuitiva è sicuramente il FindControl sulla proprietà Master, che non tradisce mai:
1: using System;
2: using System.Web.UI.WebControls;
3:
4: namespace WebApplication6
5: {
6: public partial class _Default : System.Web.UI.Page
7: {
8: protected void Page_Load(object sender, EventArgs e)
9: {
10: Menu masterMenu = this.Master.FindControl("NavigationMenu") as Menu;
11: }
12: }
13: }
Esiste però una tecnica che vi permette di accedere in maniera semplice al contenuto della master page: il MasterType.
Impostando questa direttiva potete istruire la vostra pagina sull’identità (il tipo) della masterpage collegata, tipizzandone la visibilità ed evitando così eventuali cast. Comunque se volete accedere ai controlli della Master (che hanno visibilità protected) dovrete comunque esporli con una property. Prendendo ad esempio il menu della master page del template web di asp.net 4 ci basta esporlo con una property pubblica:
1: using System;
2: using System.Web.UI.WebControls;
3:
4: namespace WebApplication6
5: {
6: public partial class SiteMaster : System.Web.UI.MasterPage
7: {
8: public Menu MainMenu { get { return this.NavigationMenu; } }
9:
10: protected void Page_Load(object sender, EventArgs e)
11: {
12: }
13: }
14: }
A quel punto aggiungere una voce al menu dalle vostre pagine diventa banalmente:
1: using System;
2: using System.Web.UI.WebControls;
3:
4: namespace WebApplication6
5: {
6: public partial class _Default : System.Web.UI.Page
7: {
8: protected void Page_Load(object sender, EventArgs e)
9: {
10: this.Master.MainMenu.Items.Add(new MenuItem("Nuova Voce Menu"));
11: }
12: }
13: }
Con l’ovvio risultato:
-- Michele
I programmatori Asp.Net Web Form conoscono bene il concetto di User Control grazie al quale è possibile creare dei propri controlli raggruppando quelli già esistenti, non tutti invece conoscono la possibilità di creare dei Templated User Control in cui non siamo noi a creare l’interfaccia che avrà il controllo ma è l’utente del nostro controllo che, attraverso la definizione di un template, può definire il rendering del controllo, un po’ come fa il controllo asp:repeater.
Nonostante possa spaventare a primo impatto, la realizzazione di questi controlli è più semplice di quello che si crede una volta capito il meccanismo. Si parte dai dati che si vogliono rappresentare, supponiamo una news:
1: using System;
2:
3: namespace WebApplication1
4: {
5: public class News
6: {
7: public string Titolo { get; set; }
8: public DateTime Data { get; set; }
9: public string Testo { get; set; }
10: public string Link { get; set; }
11: }
12: }
Creiamo uno user control come siamo abituati a fare, aggiungendolo come nuovo item, e nel markup l’unica cosa che dobbiamo fare è creare un PlaceHolder:
1: <%@ Control Language="C#" AutoEventWireup="true"
2: CodeBehind="NewsTemplateContoller.ascx.cs"
3: Inherits="WebApplication1.UC.NewsTemplateContoller" %>
4:
5: <asp:PlaceHolder id="PlaceHolderNewsTemplate" runat="server">
6: </asp:PlaceHolder>
Definiamo nel code behind del controllo due property, una del nostro tipo News e l’altra di tipo ITemplate che chiameremo LayoutTemplate:
1: using System;
2: using System.Web.UI;
3:
4: namespace WebApplication1.UC
5: {
6: public partial class NewsTemplateContoller : System.Web.UI.UserControl
7: {
8: [PersistenceMode(PersistenceMode.InnerProperty)]
9: [TemplateContainer(typeof(NewsUcContainer))]
10: public ITemplate LayoutTemplate { get; set; }
11:
12: public News News { get; set; }
13: }
14: }
La property ITemplate deve essere decorata con due attributi:
-
PersistenceMode, che specifica come un controlo asp.net persiste le proprietà a design time, nel nostro caso InnerDefaultProperty specifica che le proprietà saranno persistite all'interno del tag di apertura e chiusura del controllo
-
TemplateContainer, che serve a indicare che è un contenitore, nel nostro caso, di contenuti di tipo NewsUcContainer
A questo punto dobbiamo creare il nostro container, che chiameremo NewsContainer e che, oltre ad essere un Control, implementerà l’interfaccia INamingContainer che è vuota e serve solo a marcare la classe come contenitore:
1: public class NewsUcContainer : Control, INamingContainer
2: {
3: public News News { get; set; }
4:
5: public NewsUcContainer(News news)
6: {
7: this.News = news;
8: }
9: }
A questo punto basta implementare il Page_Init del nostro controllo per legare quanto realizzato fino a questo momento:
1: protected void Page_Init(object sender, EventArgs e)
2: {
3: PlaceHolderNewsTemplate.Controls.Clear();
4:
5: if(LayoutTemplate != null)
6: {
7: if (this.News == null) this.News = new News();
8: NewsUcContainer container = new NewsUcContainer(this.News);
9: this.LayoutTemplate.InstantiateIn(container);
10: PlaceHolderNewsTemplate.Controls.Add(container);
11: }
12: }
In pratica svuotiamo il placeholder da eventuali contenuti e se il LayoutTemplate non è vuoto istanziamo il container e lo riversiamo nel LayoutTemplate, dopodichè non ci resta che aggiungere il container ai controlli del placeholder.
Usare il nostro controllo significa come al solito registrarlo nella pagina…
1: <%@ Register src="UC/NewsTemplateContoller.ascx" tagname="NewsTemplateContoller" tagprefix="uc1" %>
e creare il template per la nostra news all’interno del LayoutTemplate:
1: <uc1:NewsTemplateContoller ID="NewsTemplateContoller1" runat="server">
2: <LayoutTemplate>
3: <h3><% 1: # Container.News.Titolo
%></h3>
4: <p style="font-style:italic"><% 1: # Container.News.Data.ToString("dd-MM-yyyy") %></p>
5: <p><% 1: # Container.News.Testo
%></p>
6: <asp:hyperlink navigateurl='<%# Container.News.Link %>' runat="server" />
7: </LayoutTemplate>
8: </uc1:NewsTemplateContoller>
Bindiamo qualche dato di prova nella Page_Load:
1: protected void Page_Load(object sender, EventArgs e)
2: {
3: NewsTemplateContoller1.News.Data = DateTime.Now;
4: NewsTemplateContoller1.News.Link = "http://www.dotnetcampania.org";
5: NewsTemplateContoller1.News.Titolo ="DotNetCampania on line!";
6: NewsTemplateContoller1.News.Testo = "Finalmente On Line il primo User Group tutto campano sulle tecnologie .NET ! Nati nel Giugno 2009 e costituitici nel Gennaio 2010 come Associazione no-profit legalmente riconosciuta, ci poniamo come obiettivo quello di riunire tutti gli appassionati di tecnologie .NET residenti in campania; anche se naturalmente possono iscriversi tutti quelli che reputeranno utile fare community con noi.";
7: NewsTemplateContoller1.DataBind();
8: }
Ed ecco il favoloso risultato:
Il consiglio è: provateci! Sembra più complicato di quello che effettivamente è quindi non lasciatevi intimorire!
-- Michele
Anche questa è una funzionalità interessante di asp.net… E’ possibile da web.config andare a chiedere ad asp.net di utilizzare un nostro controllo custom anzichè un controllo standard di asp.net:
<pages controlRenderingCompatibilityVersion="4.0" clientIDMode="AutoID">
<tagMapping>
<add tagType="System.Web.UI.WebControls.Button"
mappedTagType="MyControls.MyButton" />
</tagMapping>
</pages>
Che sostituirà tutti i button di asp.net con il button personalizzato. Implementare un proprio button è un’operazione abbastanza semplice, basta creare un progetto CustomControl, nel mio caso MyControls ed estendere il controllo a cui vogliamo aggiungere qualche funzionalità. Supponiamo ad esempio di voler fare in modo che quando passiamo con il mouse sul pulsante il suo testo diventi ‘cliccami’:
1: using System.Web.UI.WebControls;
2:
3: namespace MyControls
4: {
5: public class MyButton : Button
6: {
7: public MyButton()
8: {
9: this.Attributes.Add("onmouseover", "this.value='cliccami'");
10: }
11: }
12: }
Il risultato sarà ovviamente:
Il tutto senza aver minimamente toccato la pagina:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication5.WebForm2" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:button text="text" runat="server" />
</div>
</form>
</body>
</html>
Su internet trovate un po’ di applicazioni interessanti come ad esempio sostituire le textbox con delle vostre textbox in cui lo sfondo diventa colorato al focus, dando all’utente un feedback sul dove sta scrivendo.
-- Michele
Come molti sanno mandare una mail con asp.net è un’operazione abbastanza semplice, basta aggiungere al web.config:
<system.net>
<mailSettings>
<smtp from="test@foo.com">
<network host="smtpserver1" port="25" userName="username" password="secret" />
</smtp>
</mailSettings>
</system.net>
Mentre nel codice basta scrivere:
1: MailMessage message = new MailMessage();
2: message.From = new MailAddress("sender@foo.bar.com");
3:
4: message.To.Add(new MailAddress("recipient1@foo.bar.com"));
5: message.To.Add(new MailAddress("recipient2@foo.bar.com"));
6: message.To.Add(new MailAddress("recipient3@foo.bar.com"));
7:
8: message.CC.Add(new MailAddress("carboncopy@foo.bar.com"));
9: message.Subject = "This is my subject";
10: message.Body = "This is the content";
11:
12: SmtpClient client = new SmtpClient();
13: client.Send(message);
Durante lo sviluppo potrebbe essere comodo evitare l’invio vero della mail ma avere comunque un modo per verificare che il contenuto inviato coincida con quanto sperato. Per fare questo è possibile aggiungere un attributo all’elemento smtp perchè l’invio avvenga verso una cartella specificata:
Scegliendo come valore SpecifiedPickupDirectory e aggiungendo le informazioni sulla directory da utilizzare il sistema creerà un file .eml con il contenuto della mail:
<system.net>
<mailSettings>
<smtp from="test@foo.com" deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="d:\mails" />
</smtp>
</mailSettings>
</system.net>
Le ragioni per utilizzare questa possibilità possono essere davvero tante:
- Testare l’invio massimo di email
- Verificare eventuali errori portando temporaneamente l’invio delle mail in un cartella per un sito in produzione
- Durante lo sviluppo per evitare le attese tipiche dell’invio e della ricezione delle mail
- Decidere di far processare l’invio delle mail nella cartella da un servizio separato
Naturalmente possiamo anche impostare il tutto da codice se volessimo ad esempio condizionare sotto if quale delivery method usare: basta impostare la proprietà DeliveryMethod dell’oggetto SmtpClient:

Venerdì scorso all’università di Ancona si è tenuto un bellissimo workshop organizzato da DotNetMarche in collaborazione con DotDotNet e Gaia sulle applicazioni orientate ai servizi su stack microsoft, partendo dal design dell’applicazione fino all’utilizzo di tfs per il suo deploy.
Purtroppo io e il fido Manu siamo arrivati un po’ in ritardo ma siamo riusciti comunque a goderci il piacere della compagnia e dei contenuti che come sempre sono stati di grande spessore tecnico. Il grande Alessandro Scardova, MVP su Blend, ci ha parlato di sketchflow e di come realizzare prototipi di applicazioni da sottoporre al cliente al solo fine di valutarne le funzionalità che saranno realizzate. Molto interessante la nuova funzionalità di pubblicazione su sharepoint che permette di condividere sia quanto realizzato, sia i feedback dei clienti. Mauro Servienti e Giorgio Formica (che non ha un blog…) ci hanno illustrato un framework da loro realizzato in Gaia per la realizzazione di applicazioni SOA in scenari molto avanzati spingendo WCF probabilmente a limiti sconosciuti all’utilizzatore medio di questa tecnologia. E’ poi tornato sul palco Alessandro che insieme a Marco Ferretti e Stefano Ottaviani ci ha mostrato come sia semplice con Blend rendere accattivanti le applicazioni realizzate dagli sviluppatori. Termina la giornata il mitico Gian Maria Ricci, parlandoci di deploy con TFS mediante configurazione delle build e personalizzazione delle stesse mediante workflow foundation.
L’evento è stato trasmesso in streaming grazie al supporto dell’università di Ancona che ha messo a disposizione l’attrezzatura, la banda e un bravissimo tecnico che ha supportato l’evento in tutta la sua interezza. Purtroppo l’assenza dell’aria condizionata e il caldo di questi giorni hanno messo a dura prova speaker ed ospiti che nello spacco per il pranzo hanno trovato refrigerio al bar dell’università…
All’evento erano presenti come sempre anche gli amici romani di DomusDotNet, Nicolò, Matteo, Massimo e Marco:
Come da abitudine l’evento si è prolungato la sera a tavola dove lo spessore degli speaker l’ha fatta ancora da padrone! Nonostante gli sforzi ancora una volta non sono riuscito a tenermi al livello dei commensali ma sto migliorando!
Un grazie di cuore a tutti gli organizzatori, in particolare a Gian Maria per l’ospitalità e al bellissimo gatto che mi ha preso subito in simpatia!
Oggi durante una docenza di aggiornamento interno mi sono reso conto che non molti sanno che è possibile mettere offline un sito Asp.Net semplicemente creando un file di nome app_offline.htm nella root dell’applicazione, una feature introdotta con Asp.Net 2.0.
L’aggiunta di questo file determina lo shutdown dell’appdomain quindi vi ritroverete con un classico 404 se tentate di accedere al sito. La stesso effetto si può ottenere aggiungendo al web.config
1: <httpRuntime enable="false" />
oppure se siete proprio svogliati potete farlo fare al pannello di amministrazione del sito web…
Quando può essere utile? Ad esempio quando dovete aggiornare il sito e non volete che gli utenti si colleghino mentre eseguite l’operazione. Ci sono altri modi per fare la stessa cosa… quelli illustrati sono compresi nel prezzo!
-- Michele
No, non è il solito post che vi spiega come calcolare il codice fiscale, di quelli ce ne sono a centinaia su internet, volevo solo segnalare un Web Service che fa tutto i lavoro per voi:
http://webservices.dotnethell.it/codicefiscale.asmx
Se sapete di dovere essere sempre connessi… può essere molto utile!
Riprendendo il precedente post volevo dare alcune indicazioni per prepararsi all’esame di certificazione. Molti esami, specie quelli Dev, hanno un libro di preparazione chiamato training kit, per il 70-536 ad esempio è questo:

Occhio all’edizione che nella prima ci sono molti argomenti trattati più dettagliatamente e che quindi vi prenderebbero più tempo di studio (inutile per l’esame ma potrebbe essere utile per cultura personale…). Nel libro trovate alla fine di ogni capitolo un po’ di domande e un po’ di lab (secondo me fondamentali per chi non usa .net per lavoro) un CD con un software per esercitarvi e un voucher di sconto del 15% per l’esame. Esistono le traduzioni in italiano di questi libri ma considerando che costano il doppio e che l’esame è in inglese… Il bello del software del CD è che potete esercitarvi man mano che studiate filtrando le domande per argomenti, oltre alla simulazione dell’esame.
Personalmente mi sento di consigliare anche un altro software che ho trovato molto utile oltre che economico: http://www.visualcertexam.com/ .
Scaricate il programma, costa 15 euro mai spesi così bene, poi cercate su internet i file per i vari esami e vi esercitate senza tregua. Ho trovato molto utile anche la versione mobile (anch’essa del costo di 15 euro) per la quale però dovete convertire i file che trovate su internet in un formato apposito con un software scaricabile gratuitamente dallo stesso sito: chi ha poco tempo per esercitarsi ma prende spesso i mezzi pubblici come me troverà l’applicazione mobile molto utile.
Se ci sono domande… non esitate a chiedere.
-- Michele
Più Post
Pagina seguente »