<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.devland.it/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Marco del Gatto - web developers blog</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/default.aspx</link><description>Consigli, trucchi, scoperte per programmatori di siti web</description><dc:language>it</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Come evitare il Quirks Mode nei browser per siti web xthml strict</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/01/22/come-evitare-il-quirks-mode-nei-browser-per-siti-web-xthml-strict.aspx</link><pubDate>Fri, 22 Jan 2010 08:04:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:487</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/01/22/come-evitare-il-quirks-mode-nei-browser-per-siti-web-xthml-strict.aspx#comments</comments><description>&lt;p&gt;Se – come si conviene - stiamo sviluppando un website adottando le specifiche XHTML Strict 1.0, risulta importante far sì che i browser degli utenti capiscano la nostra intenzione utilizzando lo Standard Mode e che non entrino quindi in Quirks Mode, la modalità “mangiatutto” utile per la renderizzazione dei web site di vecchia generazione ma che rischia di danneggiare sia il layout che le performance dei web site realizzati correttamente con i nuovi standard.&lt;/p&gt;
&lt;p&gt;Per fare questo, una volta che abbiamo validato il nostro documento e siamo certi di essere conformi agli standard, basta seguire questi 3 semplici passi:&lt;/p&gt;
&lt;p&gt;1 - Mettere il doctype con url COMPLETA al DTD: 
&lt;div class="codice"&gt;&lt;font face="Courier New"&gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&amp;gt;&lt;/font&gt;&lt;/div&gt;
&lt;p&gt;2 – Specificare nel css principale che il TAG IMG è di tipo block (questo compensa l’Almost Standard Mode di Gecko): 
&lt;div class="codice"&gt;img{display:block;}&lt;/div&gt;
&lt;p&gt;3 – impedire agli utenti di IE8 di passare alla modalità compatibile mettendo la seguente direttiva nella head: 
&lt;div class="codice"&gt;&amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=8&amp;quot; /&amp;gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=487" width="1" height="1"&gt;</description></item><item><title>Enum Mapping bug nel designer di LinqToSql</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2009/11/06/enum-mapping-bug-nel-designer-di-linqtosql.aspx</link><pubDate>Fri, 06 Nov 2009 13:31:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:410</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2009/11/06/enum-mapping-bug-nel-designer-di-linqtosql.aspx#comments</comments><description>&lt;p&gt;Con LinqToSql è possibile mappare automaticamente i campi INT di SqlServer ai corrispondenti valori di un tipo enum C#.&lt;/p&gt;&lt;p&gt;Questo rappresenta una grande comodità nella scrittura del codice in quanto le classi autogenerate espongono la corrispondete proprietà tipizzata nell&amp;#39;enum scelto, evitando noisi passaggi di trascodifica.&lt;/p&gt;
&lt;p&gt;Tuttavia alle volte il designer genera dei messaggi di errore del tipo:&lt;/p&gt;
&lt;div class="codice"&gt;DBML1005: Mapping between DbType &amp;#39;Int&amp;#39; and Type &amp;#39;AnApp.AnEnum&amp;#39; in Column &amp;#39;EnumDBColumn&amp;#39; of Type &amp;#39;ATable&amp;#39; is not supported.&lt;/div&gt;
&lt;p&gt;Per aggirare il problema quando specificate il nome del tipo enum nella proprietà Type del designer anteponete il prefisso &amp;quot;global::&amp;quot;. &lt;/p&gt;
&lt;p&gt;Ad esempio se il nostro enum si chiama:&lt;/p&gt;
&lt;div class="codice"&gt;MioProgetto.MioNamespace.MioEnum&lt;/div&gt;
&lt;p&gt;dichiaratelo come:&lt;/p&gt;
&lt;div class="codice"&gt;global::MioProgetto.MioNamespace.MioEnum&lt;/div&gt;&lt;br /&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=410" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/sviluppo/default.aspx">sviluppo</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/.net/default.aspx">.net</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Leggere i metadati di un file bitmap</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2009/04/19/leggere-i-metadati-di-un-file-bitmap.aspx</link><pubDate>Sun, 19 Apr 2009 07:23:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:309</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2009/04/19/leggere-i-metadati-di-un-file-bitmap.aspx#comments</comments><description>&lt;p&gt;Mi è capitato di dover accedere da programma ai metadati (Keywords, Title, Rating, ecc)&amp;nbsp; impostati nei metadati di un insieme di file jpg; questi metadati possono essere impostati da qualsiasi programma di grafica o dal sistema operativo stesso.&lt;/p&gt;
&lt;p&gt;Il framework .NET ci mette a disposizione un modo semplice per accedere a queste informazioni. Innanzitutto è necessario referenziare le seguenti librerie:&lt;/p&gt;
&lt;div class="codice"&gt;PresentationCore&lt;br /&gt;WindowsBase&lt;/div&gt;
&lt;p&gt;Fatto questo l&amp;#39;accesso ai metadati è davvero semplice. Vi riporto nel seguito il codice di una console application in VB.NET che visualizza il Title e le Keywords letti da un jpg:&lt;/p&gt;
&lt;div class="codice"&gt;&lt;pre&gt;Imports System.Windows.Media.Imaging
Module Module1

    Sub Main()
        Dim decoder As New JpegBitmapDecoder(New Uri(&amp;quot;C:\tmp\immagine.jpg&amp;quot;), _
              BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad)
        Dim bitmap As BitmapMetadata = decoder.Frames(0).Metadata

        Console.WriteLine(bitmap.Title)
        Console.WriteLine(&amp;quot;------------------------------------&amp;quot;)
        For Each k In bitmap.Keywords
            Console.WriteLine(k)
        Next

        Console.ReadLine()
    End Sub

End Module
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Grazie a Marco Nava per il tip. &lt;/p&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=309" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/.net/default.aspx">.net</category></item><item><title>Lunghezza stringhe JSON in ScriptServices di ASP.NET</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2009/03/31/lunghezza-stringhe-json-in-scriptservices-di-asp-net.aspx</link><pubDate>Tue, 31 Mar 2009 08:38:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:308</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2009/03/31/lunghezza-stringhe-json-in-scriptservices-di-asp-net.aspx#comments</comments><description>&lt;p&gt;Se invocate WebServices via javascript attraverso gli ScriptServices dello ScriptManager di ASP.NET, potreste incorrere in un problema di lunghezza massima delle variabili di tipo stringa; il problema&amp;nbsp; è semplicemente dovuto ai default applicati dal framework (poco più di 500 caratteri) e non da una limitazione di JSON o di javascript.&lt;/p&gt;
&lt;p&gt;Per aumentare tale parametro è sufficiente agire come segue nel web.config:&lt;/p&gt;
&lt;div class="codice"&gt;&amp;lt;system.web.extensions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;scripting&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;webServices&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;jsonSerialization maxJsonLength=&amp;quot;10000000&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/webServices&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;scriptResourceHandler enableCompression=&amp;quot;true&amp;quot; enableCaching=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/scripting&amp;gt;&lt;br /&gt;&amp;lt;/system.web.extensions&amp;gt; 
&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=308" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/webservice/default.aspx">webservice</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/json/default.aspx">json</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/javascript/default.aspx">javascript</category></item><item><title>Oggetti COM ActiveX su IIS7 a 64bit</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2009/02/20/oggetti-com-activex-su-iis7-a-64bit.aspx</link><pubDate>Fri, 20 Feb 2009 09:13:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:301</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2009/02/20/oggetti-com-activex-su-iis7-a-64bit.aspx#comments</comments><description>&lt;p&gt;Se state migrando delle applicazioni in Classic ASP che fanno uso di oggetti ActiveX COM su server Windows 2008 a 64 bit, potreste incappare nel classico errore:&lt;/p&gt;
&lt;br /&gt;
&lt;div class="codice"&gt;
ActiveX Component cannot create object
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Questo avviene perché per default l’esecuzione di codice legacy a 32 bit è disabilitato sugli application pool di iis7 a 64bit.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;La soluzione è semplice: individuate l’application pool utilizzato dal sito web, andate negli Advanced Settings e impostate il flag &lt;b&gt;Enable 32bit Application&lt;/b&gt; a true.
&lt;/p&gt;
&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=301" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/IIS7/default.aspx">IIS7</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/Classic+ASP/default.aspx">Classic ASP</category></item><item><title>Determinare se il testo di FCKEditor è logicamente nullo</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/12/18/determinare-se-il-testo-di-fckeditor-232-logicamente-nullo.aspx</link><pubDate>Thu, 18 Dec 2008 08:19:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:291</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/12/18/determinare-se-il-testo-di-fckeditor-232-logicamente-nullo.aspx#comments</comments><description>&lt;p&gt;Se utilizzate l&amp;#39;ottimo &lt;a class="" title="FKCEditor" href="http://www.fckeditor.net/" target="_blank"&gt;FCKEditor&lt;/a&gt; all&amp;#39;interno delle vostre applicazioni, potrebbe capitarvi di avere la necessità di sapere se il testo inserito dall&amp;#39;utente è nullo da un punto di vista &amp;quot;logico&amp;quot;; infatti il controllo tende a inserire comunque dei tag invisibili (es: &amp;quot;&amp;amp;nbsp;&amp;quot;, ecc) che in caso di assenza di altro testo valido tendono a creare dei falsi positivi.&lt;/p&gt;
&lt;p&gt;Vi potrebbe essere utile questa ruotine che ho scritto che effettua una validazione custom dell&amp;#39;input:&lt;/p&gt;
&lt;div class="codice"&gt;&lt;pre&gt;public static bool IsFCKEditorTextEmpty(string value)
{

if (value == null) return true;

string input = value;
input = Regex.Replace(input, &amp;quot;&amp;lt;[^&amp;gt;]*&amp;gt;&amp;quot;, &amp;quot;&amp;quot;, RegexOptions.IgnoreCase);
input = Regex.Replace(input, @&amp;quot;&amp;amp;\w+;&amp;quot;, &amp;quot;&amp;quot;, RegexOptions.IgnoreCase);
input = input.Trim();

return input == &amp;quot;&amp;quot;;

}
&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=291" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/fckeditor/default.aspx">fckeditor</category></item><item><title>Selettori standard per la property grid per User e Custom Controls</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/09/12/selettori-standard-per-la-property-grid-di-visual-studio-per-user-e-custom-controls.aspx</link><pubDate>Fri, 12 Sep 2008 06:36:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:253</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/09/12/selettori-standard-per-la-property-grid-di-visual-studio-per-user-e-custom-controls.aspx#comments</comments><description>&lt;p&gt;Se lavorate molto con User Controls o Custom Controls, avrete senz&amp;#39;altro la necessità di personalizzare il modo in cui le proprietà pubbliche di questi appaiono nella property grid di Visual Studio, onde evitare le limitazioni della classica casella di testo libera.&lt;/p&gt;
&lt;p&gt;Su suggerimento del mio amico Marco Nava, vi riporto una collezione degli attributi più usati per personalizzarle.&lt;/p&gt;
&lt;p&gt;Nota: gli attributi possono anche essere sommati tra di loro.&lt;/p&gt;
&lt;p&gt;Nota 2: gli attributi sono dichiarati in vari namespace/assembly, per sicurezza importate i seguenti:&lt;/p&gt;
&lt;div class="codice"&gt;&lt;pre&gt;using System;
using System.ComponentModel;
using System.Windows.Forms.Design;
using System.Drawing.Design;
using System.Web.UI.Design;
using System.ComponentModel.Design;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;strong&gt;[Browsable(false)]&lt;/strong&gt; 
Nasconde una proprietà pubblica all’interno della property grid.

&lt;strong&gt;[Category(&amp;quot;Stringhe di connessione&amp;quot;)]&lt;/strong&gt;
Consente di raggruppare più proprietà in una categoria.

&lt;strong&gt;[Description(&amp;quot;Connessione al DB centrale&amp;quot;)]&lt;/strong&gt; 
Descrizione estesa che compare sotto la griglia nel box dedicato ai tooltip.

&lt;strong&gt;[DefaultValue(xx)]&lt;/strong&gt; 
Consente di specificare il valore di default. Ha override per tutti i tipi base.

[&lt;strong&gt;EditorAttribute(typeof(ConnectionStringEditor), typeof(UITypeEditor))]&lt;/strong&gt; 
Il campo è una stringa e contiene una stringa di connessione. La property grid visualizza un editor apposito (che poi di solito è un banalissimo box di testo multilinea)

&lt;strong&gt;[EditorAttribute(typeof(FolderNameEditor), typeof(UITypeEditor))]&lt;/strong&gt; 
Il campo contiene un nome di cartella. La prop.grid visualizza il pulsante […] che consente di scegliere il path.

&lt;strong&gt;[EditorAttribute(typeof(FileNameEditor), typeof(UITypeEditor))]&lt;/strong&gt; 
Il campo è un percorso ad un file. La prop.grid visualizza il pulsante […] che consente di scegliere un file.

&lt;strong&gt;[EditorAttribute(typeof(CollectionEditor), typeof(UITypeEditor))]&lt;/strong&gt; 
Il campo è una collection. Se type è un tipo base (stringa, interi, ecc) visualizza un editor standard che consente di modificare e aggiungere/togliere elementi dalla collezione. A me nell’aggiungere crashava miseramente... In teoria partendo da questo ci si può derivare un editor personalizzato per collezioni di oggetti propri.

&lt;strong&gt;[EditorAttribute(typeof(MultilineStringEditor), typeof(UITypeEditor))]&lt;/strong&gt;        
Il campo è un testo lungo su più linee. La prop.grid visualizza una casella multilinea per consentire una più agevole digitazione.
&lt;/pre&gt;&lt;pre&gt;&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;font face="Calibri" size="3"&gt;Oltre a questi sono disponibili tutti i derivati di UITypeEditor (per colori, font, icone, data e ora, url, ecc.):&lt;/font&gt;&lt;/p&gt;&lt;font face="Calibri" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.drawing.design.uitypeeditor.aspx"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;http://msdn.microsoft.com/en-us/library/system.drawing.design.uitypeeditor.aspx&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;/pre&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=253" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/sviluppo/default.aspx">sviluppo</category></item><item><title>Disabilitare un asp:button al postback, con validazione e conferma</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/08/31/disabilitare-un-asp-button-al-postback-compatibilmente-con-la-validazione.aspx</link><pubDate>Sun, 31 Aug 2008 08:37:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:248</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/08/31/disabilitare-un-asp-button-al-postback-compatibilmente-con-la-validazione.aspx#comments</comments><description>&lt;p&gt;In certi casi puo&amp;#39; essere necessario impedire all&amp;#39;utente di premere piu&amp;#39; volte un pulsante: non c&amp;#39;e&amp;#39; un modo standard per farlo allora ho pensato di pacchettizzare alcune strategie trovate sul web&amp;nbsp;sotto forma di&amp;nbsp;due extension method per la classe Button.&lt;/p&gt;
&lt;p&gt;Il primo applica solamente la disabilitazione (manetendo inalterate le validazioni eventualmente presenti sulla pagina), mentre il secondo permette di specificare ancheun testo di conferma prima di procedere col postback.&lt;/p&gt;
&lt;p&gt;Verificate di avere una veriosne del framework uguale o superiore alla .NET 3.5 Service Pack 1, copiatevi questa classe nel progetto, e mettela in un namespace a volta scelta:&lt;/p&gt;
&lt;div class="codice"&gt;&lt;pre&gt;  
public static class ButtonExtender
{
public static void SetDisabledOnPostback(this Button button, String waitMessage)
{

StringBuilder sb = new StringBuilder();
sb.Append(&amp;quot;if (typeof(Page_ClientValidate) == &amp;#39;function&amp;#39;) { &amp;quot;);
if (button.ValidationGroup == &amp;quot;&amp;quot;)
  sb.Append(&amp;quot;if (Page_ClientValidate()&amp;quot;);
else
  sb.AppendFormat(&amp;quot;if (Page_ClientValidate(&amp;#39;{0}&amp;#39;)&amp;quot;, button.ValidationGroup);
sb.Append(&amp;quot; == false) { return false; }} &amp;quot;);
sb.AppendFormat(&amp;quot;this.value = &amp;#39;{0}&amp;#39;;&amp;quot;, waitMessage);
sb.Append(&amp;quot;this.disabled = true;&amp;quot;);

button.UseSubmitBehavior = false;
button.OnClientClick = sb.ToString();


}

public static void SetDisabledOnPostbackWithConfirm(this Button button, 
				String waitMessage, String confirmText)
{

//disabilitazione standard
SetDisabledOnPostback(button, waitMessage);

//aggiunta della conferma
StringBuilder sb = new StringBuilder(button.OnClientClick);
sb.Insert(0, &amp;quot;if (confirm(&amp;#39;&amp;quot; + confirmText + &amp;quot;&amp;#39;) == false){return false;} &amp;quot;);

button.OnClientClick = sb.ToString();

}
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A questo punto è sufficiente che nella pagina di interesse referenziate il namespace in cui avete messo la classe e nel page load lanciate:&lt;/p&gt;
&lt;div class="codice"&gt;&lt;pre&gt;       
this.myButton.SetDisabledOnPostback(&amp;quot;Attendere prego...&amp;quot;);

this.myButton.SetDisabledOnPostbackWithConfirm
                    (&amp;quot;Attendere prego...&amp;quot;, &amp;quot;Vuoi procedere ?&amp;quot;);
&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=248" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Equivalente VB.NET delle lambda expression in C#</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/07/08/equivalente-vb-net-delle-lambda-expression-in-c.aspx</link><pubDate>Tue, 08 Jul 2008 15:01:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:242</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/07/08/equivalente-vb-net-delle-lambda-expression-in-c.aspx#comments</comments><description>&lt;p&gt;Se state usando le funzionalità di Linq in C# per l’interrogazione di insiemi vari, vi sarete abituati a sintassi di questo tipo:&lt;/p&gt;
&lt;div class="codice"&gt;User usr= Users.Single(u=&amp;gt;u.Username==&amp;quot;marco&amp;quot;);&lt;/div&gt;
&lt;p&gt;Mi è capitato di dover scrivere l’equivalente VB.NET, e – per ragioni varie – di non voler usare la sintassi espressiva; in questo caso ho trovato difficoltà a reperire informazioni su come tradurre la definizione della lambda: u=&amp;gt;u.Username==”marco”&lt;/p&gt;
&lt;p&gt;Su suggerimento del mio amico Marco Nava, ecco dunque la versione VB.NET:&lt;/p&gt;
&lt;div class="codice"&gt;dim usr as User = Users.Single(Function(u) u.Username=&amp;quot;marco&amp;quot;)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=242" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/sviluppo/default.aspx">sviluppo</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/.net/default.aspx">.net</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Come supportare min-height, min-width, max-height e max-width su Internet Explorer 6</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/05/26/come-supportare-min-height-min-width-max-height-e-max-width-su-internet-explorer-6.aspx</link><pubDate>Mon, 26 May 2008 06:04:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:239</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>1</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/05/26/come-supportare-min-height-min-width-max-height-e-max-width-su-internet-explorer-6.aspx#comments</comments><description>&lt;p&gt;Realizzando un layout css ci si scontra spesso con le limitazioni della versione 6 di Internet Explorer, limitazioni che vanno affrontate e risolte in quanto tale browser è ancora ad oggi molto diffuso.&lt;/p&gt;
&lt;p&gt;Due limitazioni particolarmente insidiose sono il mancato supporto per le istruzioni min-height / min-width e max-height / max-width, che possono essere facilmente risolte&amp;nbsp; con due diverse tecniche.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;min-height / min-width&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Consideriamo il seguente esempio:&lt;/p&gt;
&lt;div class="codice"&gt;min-height: 150px;&lt;/div&gt;
&lt;p&gt;Il problema si risolve riscrivendo il frammento in questo modo:&lt;/p&gt;
&lt;div class="codice"&gt;height: auto !important;&lt;br /&gt;height: 600px;&lt;br /&gt;min-height: 600px; &lt;/div&gt;
&lt;p&gt;Il trucco funziona perché in questo modo per Internet Explorer 6 l’unica riga valida delle tre è la seconda - che gli da una height fissa dalla quale è in grado di sforare se il contenuto lo forzerà, simulando così l’effetto min-height - mentre per tutti gli altri browser – che supportando la direttiva !important – le righe valide saranno la prima e la terza, che ci garantiscono l’effetto desiderato.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;max-width / max-height&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Per l’accoppiata max-width / max-height dobbiamo invece usare un’altra tecnica che sfrutta la capacità di explorer 6 di applicare delle espressioni javascript ai fogli stile.&lt;/p&gt;
&lt;p&gt;Consideriamo il seguente esempio:&lt;/p&gt;
&lt;div class="codice"&gt;max-width:230px;&lt;/div&gt;
&lt;p&gt;Il problema si risolve riscrivendo il frammento in questo modo:&lt;/p&gt;
&lt;div class="codice"&gt;max-width:230px;&lt;br /&gt;width: expression(this.width &amp;gt; 230 ? 230:true);&lt;/div&gt;
&lt;p&gt;In pratica per tutti I browser che non supportano le espressioni l’unica riga valida sarà la prima, mentre per ie6 l’unica riga valida è la seconda che non è altro che la versione javascript della direttiva max-width.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=239" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/css/default.aspx">css</category></item><item><title>Tamponare gli attacchi di sql injection su SQLServer</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/05/14/tamponare-gli-attacchi-di-sql-injection-su-sqlserver.aspx</link><pubDate>Wed, 14 May 2008 08:36:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:238</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/05/14/tamponare-gli-attacchi-di-sql-injection-su-sqlserver.aspx#comments</comments><description>&lt;p&gt;Gli attacchi effettuati ai siti web attraverso sql injection devono essere bloccati attraverso la riscrittura del codice sorgente, al fine di evitare l’utilizzo diretto dei parametri passati attraverso querystring o post nelle query sql: su questo argomento si trova molta letteratura online.&lt;/p&gt;
&lt;p&gt;Tuttavia ci sono casi dove questa attività potrebbe essere troppo dispendiosa, se non impraticabile (magari non abbiamo sviluppato noi il sito e lo dobbiamo solo erogare).&lt;/p&gt;
&lt;p&gt;In questi casi si può tamponare l’attacco considerando il fatto che questi attacchi nella maggior parte dei casi prevedono l’iniezione di uno script sql che:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;legge l’elenco delle tabelle e delle colonne da sysobects e syscolumns sulla database corrente, sfruttando la connessione attiva&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;crea dinamicamente procedure di update sui campi testo, appendendovi del codice javascript (che, una volta visualizzato dai browser lancerà a suo volta del codice maligno)&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Facendo girare la webapplication con un utente sql che NON ABBIA i permessi di lettura su sysobjects e syscolumns il problema può essere tamponato.&lt;/p&gt;
&lt;p&gt;Ovviamente il problema persiste nel caso in cui l’attaccante conosca la struttura del vostro database, anche se è un caso molto più raro (di norma si tratta di worm, non di attacchi mirati).&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=238" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/sqlserver/default.aspx">sqlserver</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/sistemi/default.aspx">sistemi</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/Classic+ASP/default.aspx">Classic ASP</category></item><item><title>Modificare lo z-index di un contenuto flash</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/05/12/modificare-lo-z-index-di-un-contenuto-flash.aspx</link><pubDate>Mon, 12 May 2008 13:48:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:237</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>3</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/05/12/modificare-lo-z-index-di-un-contenuto-flash.aspx#comments</comments><description>&lt;p&gt;Per permettere a contenuti html (o dhtml) di essere visualizzati sovrapposti&amp;nbsp;a&amp;nbsp;contenuti flash, le normali direttive z-index applicabili ai div non servono.&lt;/p&gt;
&lt;p&gt;La soluzione è quella di aggiungere un parametro di configurazione ai tag object e embed del flash.&lt;/p&gt;
&lt;p&gt;Il parametro è &lt;strong&gt;wmode&lt;/strong&gt;, e va impostato su &lt;strong&gt;transparent&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="codice"&gt;&lt;pre&gt;&amp;lt;OBJECT ...&amp;gt;
          &amp;lt;PARAM NAME=&amp;quot;wmode&amp;quot; VALUE=&amp;quot;Transparent&amp;quot;&amp;gt;
          &amp;lt;embed ....&amp;nbsp; wmode=&amp;quot;Transparent&amp;quot;&amp;gt;&amp;lt;/embed&amp;gt;
&amp;lt;/OBJECT&amp;gt;
 

&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=237" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/sviluppo/default.aspx">sviluppo</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/flash/default.aspx">flash</category></item><item><title>Webcast OBA: costruire uno scenario end-to-end</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/03/27/webcast-oba-costruire-uno-scenario-end-to-end.aspx</link><pubDate>Thu, 27 Mar 2008 15:01:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:228</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>2</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/03/27/webcast-oba-costruire-uno-scenario-end-to-end.aspx#comments</comments><description>&lt;p&gt;Ho realizzato per la Microsoft una serie di 4 webcast che illustrano come realizzare uno scenario Office Business Application.&lt;/p&gt;
&lt;p&gt;Potete guardarli direttamente sull&amp;#39;MSDN a questo indirizzo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn2.microsoft.com/it-it/cc424919.aspx"&gt;http://msdn2.microsoft.com/it-it/cc424919.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I temi trattati sono:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;Configurare il Business Data Catalog&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Utilizzo dei dati aziendali in Sharepoint&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Erogazione dati BDC via webservice&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Customizzazione Client Office&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;buon divertimento!&lt;/p&gt;
&lt;p&gt;m.&lt;/p&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=228" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/sviluppo/default.aspx">sviluppo</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/OBA/default.aspx">OBA</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/sharepoint/default.aspx">sharepoint</category></item><item><title>Rimappare C# enum su valori codificati e viceversa (seconda edizione)</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/02/08/rimappare-c-enum-su-valori-codificati-e-viceversa-seconda-edizione.aspx</link><pubDate>Fri, 08 Feb 2008 08:10:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:180</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/02/08/rimappare-c-enum-su-valori-codificati-e-viceversa-seconda-edizione.aspx#comments</comments><description>&lt;p&gt;Capita spesso di dover confrontare&amp;nbsp;i valori di un&amp;nbsp;enum con delle stringhe (ad esempio i corrispondenti valori salvati nel database) sia in un senso - da un enum ottenere la corrispondente stringa&amp;nbsp; che nell&amp;#39;altro - da una stringa ottenere l&amp;#39;enum.&lt;/p&gt;
&lt;p&gt;Sfruttando gli extensions method di .NET 3.5 vi ho preparato due agevoli routine riutilizzabili&amp;nbsp;in ogni&amp;nbsp;circostanza, come estensioni del tipo String e Enum.&lt;/p&gt;
&lt;p&gt;Consideriamo di avere il seguente enum:&lt;/p&gt;
&lt;div class="codice"&gt;&lt;pre&gt; public enum eOrderStatus
    {
        [Description(&amp;quot;PEN&amp;quot;)]
        Pending,
        [Description(&amp;quot;CAN&amp;quot;)]
        Canceled,
        [Description(&amp;quot;CON&amp;quot;)]
        Confirmed,
        [Description(&amp;quot;PAY&amp;quot;)]
        Payed,
        [Description(&amp;quot;SHI&amp;quot;)]
        Shipped
    }
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Grazie alle nostre due routine otteniamo la possibilità di scrivere il seguente codice (basta che siano in un namespace importato):&lt;/p&gt;
&lt;div class="codice"&gt;&lt;pre&gt;            //dall&amp;#39;enum ottengo la stringa
            string desc = eOrderStatus.Payed.GetDescription();

            //dalla stringa ottengo l&amp;#39;enum
            string code = &amp;quot;PEN&amp;quot;;
            eOrderStatus e = code.GetEnumFromCode&amp;lt;eOrderStatus&amp;gt;();
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ed ecco le due routine che fanno il lavoro per noi: &lt;/p&gt;
&lt;div class="codice"&gt;&lt;pre&gt;            
using System.ComponentModel;&lt;br /&gt;using System.Reflection;&amp;nbsp;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;public static class EnumExtensions
{
 public static string GetDescription(this Enum enumItem)
 {

  FieldInfo fi = enumItem.GetType().GetField(enumItem.ToString());
 
  DescriptionAttribute[] attributes = 
     (DescriptionAttribute[])fi.GetCustomAttributes(
                                       typeof(DescriptionAttribute), false);
 
  return (attributes.Length &amp;gt; 0) ? 
                            attributes[0].Description : enumItem.ToString();
 }

 public static TEnum GetEnumFromCode&amp;lt;TEnum&amp;gt;(this String code)
 {
     Type e = typeof(TEnum);
     foreach (FieldInfo fi in e.GetFields())
     {
       DescriptionAttribute[] attributes = 
        (DescriptionAttribute[])fi.GetCustomAttributes(
                                      typeof(DescriptionAttribute), false);
        
        if (attributes.Length &amp;gt; 0)
         {
             if (attributes[0].Description == code) 
                 return (TEnum)fi.GetValue(fi) ;
         }
     }
     return default(TEnum);
 }
}

&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=180" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/sviluppo/default.aspx">sviluppo</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/.net/default.aspx">.net</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/c_2300_/default.aspx">c#</category></item><item><title>Linq To Sql - aggiornare entità detached si può!</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/01/22/linq-to-sql-aggiornare-entit-224-detached.aspx</link><pubDate>Tue, 22 Jan 2008 21:59:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:145</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/01/22/linq-to-sql-aggiornare-entit-224-detached.aspx#comments</comments><description>&lt;p&gt;Ecco un modo funzionante - non l&amp;#39;unico, ma il più generalizzabile che ho trovato - per poter aggiornare attraverso un nuovo DataContext una entità precedentemente recuperata da un altro DataContext e poi utilizzata in libertà su è giù per i layer della nostra applicazione, in modalità connessa o disconnessa.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;dal property grid del designer visual studio, &lt;strong&gt;mettete a Never la proprietà Update Check&lt;/strong&gt; di tutte le colonne della entità&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;utilizzate nel seguente modo il metodo Attach del nuovo DataContext:&lt;/div&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;Passate un clone della entità&lt;/strong&gt; da aggiornare invece che l&amp;#39;entità stessa, ottenuto con la funzione generica che vi indico sotto denominata CloneTableItem, che rimuove di fatto i riferimenti deferred a tutte le entità relazionate - che sono la causa di tutti i problemi del metodo Attach()&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Utilizzate l&amp;#39;overload che prevede il secondo parametro bool &lt;strong&gt;asModified impostandolo su True&lt;/strong&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;li&gt;
&lt;div&gt;lanciate SubmitChanges()&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;In pratica il codice di aggiornamento rimane semplicissimo, come in questo esempio:&lt;/p&gt;
&lt;div class="codice"&gt;&lt;pre&gt; private static void UpdateCustomer(Customer c)
        {
            CompaniesDataContext dc = new CompaniesDataContext();
            dc.Customers.Attach(CloneTableItem&amp;lt;Customer&amp;gt;(c), true);
            dc.SubmitChanges();
        }
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;dove CloneTableItem è una routine generica che potete riutilizzare per tutte le entità, siffatta:&lt;/p&gt;
&lt;div class="codice"&gt;&lt;pre&gt;  

       using System.ComponentModel;
       using System.Data.Linq.Mapping;

        static public T CloneTableItem&amp;lt;T&amp;gt;(T src) where T : class, new()
        {

            T newInstance = new T();

            PropertyDescriptorCollection srcProps = TypeDescriptor.GetProperties(src);
            foreach (PropertyDescriptor prop in srcProps)
            {
                if (prop.Attributes[typeof(ColumnAttribute)] == null)
                {
                    continue;
                }

                object val = prop.GetValue(src);
                prop.SetValue(newInstance, val);

            }

            return newInstance;
        }
&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=145" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/sviluppo/default.aspx">sviluppo</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/.net/default.aspx">.net</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/webservice/default.aspx">webservice</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/LINQ/default.aspx">LINQ</category></item></channel></rss>