Posts
129
Comments
206
Trackbacks
6
mercoledì 17 marzo 2010
ASP.NET Tip: TextBox readonly e ViewState


Se si setta la proprietà ReadOnly di un TextBox ASP.NET a True, si avrà lo spiacevole effetto collaterale di perdere il viewstate del TextBox durante i postback.
Questo perchè la proprietà ReadOnly viene valutata lato server e, indicando che il controllo è ReadOnly, implicitamente indica che tutte le modifiche lato client saranno ignorate.

Per ovviare a questo problema si può impostare il readonly nella classica maniera impostando reaonly=”readonly” sul TextBox, oppure da codice utilizzando la proprietà attributes:

   1: this.txtTest.Attributes.Add("readonly", "readonly");
posted @ mercoledì 17 marzo 2010 12.42 | Feedback (0)
martedì 2 marzo 2010
Timeout costante con System.Net.Mail e SSL


Se avete avuto necessità di inviare email tramite un SMTP con SSL potreste incontrare il problema che ho riscontrato io. In sostanza utilizzando il codice seguente, l’effetto che si ha è quello di un timeout costante in fase di invio:

   1: Dim smtp As New SmtpClient("SERVER", 465)
   2: Dim cred As New System.Net.NetworkCredential("USERNAME", "PASSWORD")
   3: smtp.UseDefaultCredentials = False
   4: smtp.Credentials = cred
   5: smtp.EnableSsl = True
   6:  ...
   7:  ...
   8: smtp.Send(message)

Il potreste è d’obbligo dato che dipende dall’SMTP che state utilizzando. Il problema è spiegato bene in questo post. In sostanza il namespace System.Net.Mail supporta solo l’Explicit SSL, che nella pratica implica che la connessione inizia sulla porta 25 come connessione in chiaro e poi switcha sulla connessione sicura.
Se l’SMTP che si sta utilizzando non ha la porta 25 aperta (come è facilmente testabile da telnet), si avrà sempre un errore di timeout.

La soluzione sarebbe quella di switchare all’Implicit SSL che wrappa l’intera connessione in modo sicuro, ma il namespace System.Net.Mail non lo supporta (…..). Come fare? Evitando di scegliere componenti di terze parti, si può tornare al vecchio namespace System.Web.Mail che supportava entrambe le modalità. Il frammento di codice seguente è equivalente al precedente ma funziona in ogni situazione.

   1: Dim mail As New System.Web.Mail.MailMessage
   2: mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", "SERVER")
   3: mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", 465)
   4: mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", True)
   5: mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "USERNAME")
   6: mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "PASSWORD")
   7: mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusing", 2)
   8: mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", 1)
   9: ...
  10: ...
  11: Web.Mail.SmtpMail.Send(mail)
posted @ martedì 2 marzo 2010 9.27 | Feedback (0)
mercoledì 13 gennaio 2010
Recuperare la public token di un assembly da Visual Studio


Dovendo lavorare spesso con assembly con strong name e avendo bisogno spesso e volentieri di conoscere la public token dell’assembly segnato, il seguente post potrebbe essere molto utile:

http://blogs.msdn.com/kaevans/archive/2008/06/18/getting-public-key-token-of-assembly-within-visual-studio.aspx

In sostanza viene indicato come creare in Visual Studio un comando che, utilizzando il tool SN, visualizza la public token dell’assembly direttamente nell’output window.

Per quanto mi riguarda un tip utilissimo!

posted @ mercoledì 13 gennaio 2010 11.50 | Feedback (0)
martedì 12 gennaio 2010
NHibernate: lazy load e il parametro not-found=”ignore”


Primo post dell’anno, sempre sul caro e “vecchio” NHibernate.
Oggi mi è capitata una situazione particolare, anche se ben codificata. Scenario molto semplice: entità con una reference ad un’altra entità. Nello specifico un preventivo collegato ad un cliente.
Il mapping che stavo utilizzando era questo:

   1: <class name="Preventivo"  table="Preventivi_Testate" lazy="true">
   2:     <id name="ID" type="Int32" unsaved-value="0">
   3:       <generator class="native" />
   4:     </id>
   5:     ...
   6:     ...
   7:     ...
   8:     <many-to-one name="Cliente" class="Cliente" column="IDAnagrafica" not-found="ignore"></many-to-one>
   9: </class>

Apparentemente tutto corretto e infatti tutto funziona senza problemi.
Andando però a controllare le query che vengono generate da NHibernate si noterà che il lazy load sull’associazione Cliente non funziona e ogni volta che si recupera un Preventivo si va a fare una query anche per recuperare il Cliente. Questo anche senza accedere alla proprietà Cliente sul Preventivo.

Il problema è dovuto al parametro not-found=”ignore”. Rimuovendolo tutto torna a funzionare correttamente.
Il comportamento è in effetti legittimo e codificato. In presenza dell’attributo not-found=”ignore”, NHibernate deve restituire l’entità nel caso sia presente e Null (o Nothing) in caso l’entità non sia presente. Per fare questo l’unico modo è ovviamente quello di andare ad eseguire la query sul database. Nel caso in cui l’attributo not-found non sia specificato, NHibernate può tranquillamente istanziare un proxy ed eventualmente lanciare un’eccezione nel caso l’entità non sia trovata.

Attenzione quindi ad utilizzare l’attributo not-found=”ignore” perché vi potreste trovare con una moltitudine di query eseguite a vostra insaputa.

posted @ martedì 12 gennaio 2010 15.24 | Feedback (0)
giovedì 31 dicembre 2009
NHibernate.Linq e l’errore "Expression of type 'System.Int32' cannot be used for return type 'System.Boolean"


Primi esperimenti con il provider LINQ per NHibernate e primi problemi.
Scenario: vorrei eseguire una semplicissima query confrontando un campo stringa con un valore immesso dall’utente. Qui di seguito la query:

   1: Dim items = From u In q _
   2:             Where u.Username = userName

La query è ovviamente banale, ma produce questo errore:

"Expression of type 'System.Int32' cannot be used for return type 'System.Boolean"

Dopo aver verificato la correttezza della mia applicazione, sono passato al solito Google. Ed ecco spiegato il problema in dettaglio in questo post: http://jason.pettys.name/archive/2009/09/28/nhibernate-with-linq-error-with-string-comparisons-in-vb.net.aspx.

Sostanzialmente quando si utilizza VB.NET, il compilatore VB emette la funzione CompareString. Qui in dettaglio un post del team di VB.NET con relativo fix: http://blogs.msdn.com/vbteam/archive/2007/09/18/vb-expression-trees-string-comparisons.aspx

Ovviamente il problema si ha solo con VB.NET e si può semplicemente risolvere passando a C# :).
Se proprio ci si ostina ad usare VB.NET (come nel mio caso) si può anche utilizzare il fix indicato nel primo post e modificare il codice sorgente di NHibernate.LINQ. Questo ovviamente in attesa che il bug venga corretto in modo ufficiale.

Attenzione però che applicando solo il fix senza nessun altro intervento sul codice sorgente, avremo che la comparazione funzionerà solo nel caso si utilizzi un singolo campo. Se si comparano più campi (ad esempio nel caso precedente Username e Password) salta fuori un altro errore che occorre gestire in qualche modo.

Al momento non ho avuto tempo di fare altri esperimenti. In ogni caso il bug è già stato segnalato in via ufficiale.

posted @ giovedì 31 dicembre 2009 13.32 | Feedback (0)
mercoledì 30 dicembre 2009
Eager load con NHibernate.Linq


Modificare la strategia di caricamento delle entità a runtime è senz’altro uno dei punti di forza di NHibernate.
Utilizzando Criteria si può utilizzare il metodo SetFetchMode per modificare la modalità di fetch, mentre chi usa HQL può usare il fetch join per eseguire un eager load di una entità. Ma volendo usare NHibernate.Linq come possiamo fare?

Fortunatamente esiste un apposito extension method, l’Expand. Nell’esempio qui sotto carichiamo una fattura con il relativo cliente utilizzando un’unica query:

   1: Dim q = Me.GetSession.Linq(Of Fattura)()
   2: q.Expand("Cliente")
   3:  
   4: Dim items = From item In q _
   5:             Where item.Numero = "10"
   6: ' Restituisco la lista
   7: Return items.ToList()(0)
posted @ mercoledì 30 dicembre 2009 16.31 | Feedback (0)
venerdì 25 settembre 2009
Problema con jQuery datepicker e IE


Utilizzo ormai jQuery e relativi controlli da molto tempo. Ieri utilizzando l’ultima versione del datepicker ho ottenuto uno strano comportamento: su Internet Explorer e solo su quello, selezionando la data corrente mi veniva restituito l’errore javascript “length is null or not an object”.

Cercando su internet sono arrivato su questo post che analizza il problema e fornisce la soluzione: come spiegato, è sufficiente utilizzare l’evento onSelect che viene scatenato ogni volta che si seleziona un giorno dal calendario. All’evento, se non ci sono altre necessità particolari, va associata una funzione vuota:

 

$(".datepicker").datepicker({ onSelect:function(){}});

posted @ giovedì 3 dicembre 2009 11.03 | Feedback (0)
giovedì 3 dicembre 2009
Visual NHibernate

Non lo conoscevo proprio! A questo indirizzo è possibile trovare Visual NHibernate un simpatico tool per creare e gestire progetti NHibernate.

E’ ancora in beta e mancano molte cose, ma mi sembra molto promettente. Sul gruppo di discussione nhusers c’e’ una discussione attiva che indica pregi e mancanze del progetto.

posted @ giovedì 3 dicembre 2009 11.02 | Feedback (2)
mercoledì 21 ottobre 2009
Disponibile Visual Studio 2010 beta 2 per tutti

Qui di seguito il link per il download: http://www.microsoft.com/visualstudio/en-gb/try/default.mspx

Al momento non mi pare sia possibile scaricare la ISO completa, ma solo un bootstrapper per il setup via web.

Update 22/10/2009

Questo il link alla ISO: http://download.microsoft.com/download/F/C/9/FC9131D2-688C-43DC-91CF-53359D4882E7/VS2010B2Ult.iso

Se volete scaricare la Express Scott Hanselman ha postato un link diretto alla ISO: http://bit.ly/2NuaZH

 

posted @ mercoledì 21 ottobre 2009 16.44 | Feedback (0)
lunedì 21 settembre 2009
Aggiungere manualmente una virtual machine ad Hyper-V


Utilizzo ormai da quasi un annetto Windows 2008 e il suo sistema di virtualizzazione, Hyper-V.
Fino a sabato scorso non ho avuto nessun tipo di problema e sono sempre stato soddisfatto. Sabato scorso però è successo l’inaspettato: all’improvviso una virtual machine ha “smesso” di essere elencata tra quelle disponibili.

Superato un primo momento di stupore, ho appurato che i file fisici della Virtual Machine c’erano, tutto era come al solito a livello di directory.
Facendo una rapida ricerca su Google ho trovato questo post in cui viene spiegato come aggiungere manualmente una virtual machine ad Hyper-V. Ovviamente la procedura non ha funzionato per me. I link erano già esistenti, ma per qualche motivo Hyper-V non vedeva più la mia macchina virtuale. Anche eliminandoli e ricreandoli non ho ottenuto nessun cambiamento.

Se non avessi avuto un hard disk virtuale con una serie di snapshot, il problema non ci sarebbe stato, avrei preso il VHD e l’avrei ricollegato ad una nuova macchina virtuale. Avendo però una serie di snapshot e dovendo ripristinare la situazione precedente ho iniziato pazientemente la ricerca sul solito Google.

Dopo vari tentativi mi sono imbattuto in quest’altro post, che descrive come fare il merge manualmente di snapshots sul file VHD originario. Il post già descrive abbastanza bene come fare, vorrei solo integrarlo con alcuni consigli:

1) Farsi sempre una copia di backup sia dei file VHD sia dei file AVHD (quelli relativi agli snapshots)
2) Gli snapshots vanno mergiati dal più recente al più vecchio
3) Per verificare quale sia l’ordine dei AVHD, basta verificare sui file la data di ultima modifica
4) Procedere rinominando un AVHD alla volta. Se si è tenuto il backup dei file, si può fare il merge sul file padre. In questo modo si sostituirà il file originario con quello modificato

Alla fine della procedura quello che si otterrà è ovviamente un file VHD completo di tutte le modifiche che potrà essere facilmente utilizzato in una nuova virtual machine.

posted @ lunedì 21 settembre 2009 10.58 | Feedback (0)
venerdì 21 agosto 2009
NHibernate: comparazione delle performance tra vari ORM


Chi come me segue vari blog e si interessa di NHibernate, avrà sicuramente visto in questi giorni una serie di post che mettono in comparazione le performance di vari ORM tra cui ovviamente NHibernate.

Il primo post che ho visto rimandava ad un sito vero e proprio, ORM Battle. NET, che come si legge nella sua homepage è un sito “devoto” alla comparazione diretta degli ORM. In questo sito è stata pubblicata una nuova tabella che mette in comparazione vari ORM tra cui NHibernate, Entity Framework, OpenAccess, etc... Oltre a questa tabella un altro esempio è stato fatto in questo post. In questo caso si mette in comparazione direttamente NHibernate con Entity Framework.

Da tutti i test si evince che NHibernate spesso e volentieri ha prestazioni più scarse rispetto agli altri ORM, risultando spesso la scelta peggiore. Non voglio stare qui a discutere della bontà o della rilevanza di questi test. Ne hanno già parlato ampiamente (Ayende 1, Ayende 2, Davy Brion’s) persone più importanti di me e sicuramente più esperte.

Volevo solo segnalare in risposta a questi “test”, il post del sempre mitico Fabio Maulo, che riprende il codice di esempio del secondo test, analizza lo scenario proposto ed effettua una serie di correzioni “minimali” che migliorano “leggermente” i risultati dei test.

Bellissima la frase finale:

Perhaps you would see the code modified… I’m working as consulter, if you want see I will happy to send you the price.

Grande Fabio, sempre mitico!

posted @ venerdì 21 agosto 2009 14.12 | Feedback (2)
Iniziare a lavorare con NHibernate e SQL CE


Nell’ultimo progetto che sto portando avanti, è nata la necessità di memorizzare una serie di dati “lato client”, evitando però di dover installare database di vario tipo o altri software aggiuntivi.
Utilizzando già NHibernate per la persistenza dei dati lato server, mi sembrava una buona cosa utilizzarlo anche lato client. Non essendo pienamente soddisfatto di Access, che ho già utilizzato in altri progetti, ho pensato di utilizzare SQL CE nella versione 3.5.

Predisporre il progetto e configuare NHibernate è molto semplice. Questo post mi è stato molto utile perchè indica in breve tutti i passi da seguire.

posted @ venerdì 21 agosto 2009 11.08 | Feedback (0)
venerdì 19 giugno 2009
TIP: Document Compatibility e relativo meta tag


Come ben si sa IE8 ha introdotto la funzionalità document compatibility attraverso la quale è possibile far girare IE8 in “emulazione” IE7 o in Quirk mode.
Sul blog di Giorgio Sardo è possibile trovare un flow chart molto esplicativo.

Per far funzionare le nostre applicazioni web in una delle modalità disponibili è sufficiente utilizzare il meta tag:

<meta http-equiv="X-UA-Compatible" content="IE=…." />

Nel caso si utilizzino le Master Page il tutto diventa molto utile dato che è sufficiente aggiungere il tag nelle varie master.
Attenzione però a dove lo si aggiunge: il tag deve essere messo prima eventuali link a file CSS, altrimenti IE8 continuerà a funzionare come al solito.

posted @ venerdì 19 giugno 2009 14.32 | Feedback (2)
mercoledì 3 giugno 2009
Visual Studio 2010: Web.Config Transformation


Segnalo un interessante post, che illustra in modo approfondito una delle nuove caratteristiche di Visual Studio 2010, le Web.Config Transformation.

posted @ mercoledì 3 giugno 2009 9.45 | Feedback (0)
sabato 23 maggio 2009
jQuery Ribbon


Ormai si moltiplicano come funghi script e plug-in per jQuery.
Oggi segnalo un plug-in per dotare le proprie applicazioni web di Ribbon. Lo script ovviamente si chiama jQuery Ribbon.

posted @ sabato 23 maggio 2009 11.55 | Feedback (0)
News
Se volete sapere con chi avete a che fare eccomi qui in uno "scatto" lavorativo.
La mia foto

Logo MCAD
Logo MCTS

Visite dal 16/03/2007:

Il mio stato su Messanger: