<?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>Devland</title><link>http://www.devland.it/cs/blogs/</link><description>from developers to developers</description><dc:language>en-US</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Intercettare il refresh di un ASP.NET UpdatePanel in javascript</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2011/11/06/intercettare-il-refresh-di-un-asp-net-updatepanel-in-javascript.aspx</link><pubDate>Sun, 06 Nov 2011 14:04:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:845</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><description>
&lt;p&gt;Può essere molto utile intercettare il refresh di un ASP.NET UpdatePanel in javascript ad esempio per reinizializzare dei listener di jQuery su oggetti del DOM che si sono modificati durante il refresh stesso.&lt;/p&gt;
&lt;p&gt;Per farlo è sufficiente registrarsi all&amp;#39;evento add_pageLoaded del PageRequestManager ed offrirgli una callback, come in questo esempio:

&lt;/p&gt;
&lt;div class="codice"&gt;

&lt;p&gt;&amp;nbsp;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(document).ready(function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(FaiQualcosa);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function FaiQualcosa() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ......&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;lt;/script&amp;gt; &lt;br /&gt;&lt;/p&gt;

&lt;/div&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=845" width="1" height="1"&gt;</description></item><item><title>CSS: Agganciare il footer a fondo pagina</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/10/13/css-agganciare-il-footer-a-fondo-pagina.aspx</link><pubDate>Wed, 13 Oct 2010 14:10:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:695</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Quella che dovrebbe essere una banalità non lo è affatto: agganciare un footer a fondo pagina in modo tale che sia in grado di &amp;quot;scendere&amp;quot; qualora ci sia molto testo&amp;nbsp;e di starsene lì in fondo se ce ne è&amp;nbsp;poco.&lt;/p&gt;
&lt;p&gt;Chi ci ha provato lo sa :)&lt;/p&gt;
&lt;p&gt;Vi segnalo la&amp;nbsp;migliore soluzione che ho trovato fino ad ora e che fa uso di solo css (no javascript):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cssstickyfooter.com/"&gt;http://www.cssstickyfooter.com/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=695" 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>Funzione JQuery per inserire testo alla posizione del cursore di una textarea</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/09/14/funzione-jquery-per-inserire-testo-alla-posizione-del-cursore-di-una-textarea.aspx</link><pubDate>Tue, 14 Sep 2010 09:15:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:663</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Per inserire via javascript del testo alla posizione corrente del cursore di una textarea, Explorer e Firefox necessitano di sintassi differenziate.&lt;/p&gt;
&lt;p&gt;Al fine di semplificarci la vita possiamo usare questo plugin di jquery:&lt;/p&gt;
&lt;div class="codice"&gt;
&lt;p&gt;$.fn.insertAtCaret = function (myValue) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return this.each(function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //IE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (document.selection) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.focus();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sel = document.selection.createRange();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sel.text = myValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.focus();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //MOZILLA&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (this.selectionStart || this.selectionStart == &amp;#39;0&amp;#39;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var startPos = this.selectionStart;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var endPos = this.selectionEnd;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var scrollTop = this.scrollTop;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.value = this.value.substring(0, startPos) + myValue + this.value.substring(endPos, this.value.length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.focus();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.selectionStart = startPos + myValue.length;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.selectionEnd = startPos + myValue.length;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.scrollTop = scrollTop;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.value += myValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.focus();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;};&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Una volta referenziato jquery e la funzione precedente, nel codice applicativo è sufficiente scrivere:&lt;/p&gt;
&lt;div class="codice"&gt;
&lt;p&gt;$(&amp;quot;&amp;lt;selettore&amp;gt;&amp;quot;). insertAtCaret(&amp;quot;testo da inserire&amp;quot;);&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=663" width="1" height="1"&gt;</description></item><item><title>L’objectdatasource ignora la cultura quando aggiorna un business object</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/09/10/l-objectdatasource-ignora-la-cultura-quando-aggiorna-un-business-object.aspx</link><pubDate>Fri, 10 Sep 2010 12:18:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:657</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Se state usando un objectdatasource agganciato ad un vostro adapter custom, potreste incorrere in spiacevoli incovenienti quando si tratta aggiornare delle proprietà sensibili alla cultura (es: campi&amp;nbsp; DateTime).&lt;/p&gt;&lt;p&gt;Quello che succede è che benché l’interfaccia utente possiate averla impostata in una certa cultura – es: italiano – l’objectdatasource quando raccoglie i dati dai controlli tenta di convertirli usando la cultura invariante, generando errori tipo:&lt;/p&gt;
&lt;div class="codice"&gt;Cannot convert value of parameter XXX from &amp;#39;System.String&amp;#39; to &amp;#39;System.DateTime&amp;#39;&lt;/div&gt;
&lt;p&gt;Il workaround è semplice: basta specificare esplicitamente I parametri sensibili alla cultura nella definizione dell’objectdatasource (cosa che normalmente è opzionale utilizzando un business object) ad esempio:&lt;/p&gt;
&lt;div class="codice"&gt;&amp;lt;InsertParameters&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Parameter Name=&amp;quot;PublishedFrom&amp;quot; Type=&amp;quot;DateTime&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Parameter Name=&amp;quot;PublishedTo&amp;quot; Type=&amp;quot;DateTime&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/InsertParameters&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;UpdateParameters&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Parameter Name=&amp;quot;PublishedFrom&amp;quot; Type=&amp;quot;DateTime&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Parameter Name=&amp;quot;PublishedTo&amp;quot; Type=&amp;quot;DateTime&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/UpdateParameters&amp;gt;&lt;/div&gt;
&lt;p&gt;In questo modo, per qualche oscura ragione, l’objectdatasource effettua correttamente le conversioni.&lt;/p&gt;
&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=657" 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/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Errore nel rendering dell'attributo Scope di TableHeaderCell in ASP.NET</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/08/04/errore-nel-rendering-dell-attributo-scope-di-tableheadercell-in-asp-net.aspx</link><pubDate>Wed, 04 Aug 2010 10:06:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:627</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Se manipolate un oggetto Table lato server in ASP.NET costruendo dinamicamente righe e colonne, state attenti all&amp;#39;attributo Scope dell&amp;#39;oggetto TableHeaderCell.&lt;/p&gt;
&lt;p&gt;Tale enum ci permette di configurare lo scope del th a scelta tra &amp;quot;Column&amp;quot; e &amp;quot;Row&amp;quot;; il primo dei due elementi dell&amp;#39;enum (Column) si renderizza però in modo errato, creando il seguente markup:&lt;/p&gt;
&lt;div class="codice"&gt;&amp;lt;th scope=&amp;quot;column&amp;quot;&amp;gt;...&lt;/div&gt;&lt;br /&gt;invece che: 
&lt;div class="codice"&gt;&amp;lt;th scope=&amp;quot;col&amp;quot;&amp;gt;...&lt;/div&gt;
&lt;p&gt;come è previsto dal W3C (&lt;a href="http://www.w3.org/TR/html401/struct/tables.html#h-11.2.4"&gt;http://www.w3.org/TR/html401/struct/tables.html#h-11.2.4&lt;/a&gt; )&lt;br /&gt;Per ovviare al problema l’unico workaround è creare un attributo generico sul TableHeaderCell.&lt;/p&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=627" width="1" height="1"&gt;</description></item><item><title>Page.ValidateRequest nel porting ad ASP.NET 4.0</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/05/04/page-validaterequest-nel-porting-ad-asp-net-4-0.aspx</link><pubDate>Tue, 04 May 2010 18:36:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:582</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>2</slash:comments><description>&lt;div&gt;Se state effettuando il porting ad ASP.NET 4.0 di applicazioni realizzate con un framework precedente, potreste trovarvi una sorpresa: le pagine nelle quali avete disabiliato la validazione automatica della request (perchè magari avete un editor html o simili) nonostante la direttiva ValidateRequest=&amp;quot;false&amp;quot; continueranno a validare la richiesta.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Per ovviare all&amp;#39;inconveniente occorre impostare nel web.config la modalità compatibile con i framework precedenti, attraverso l&amp;#39;inserimento del seguente nodo dentro system.web: &lt;/div&gt;&lt;br /&gt;
&lt;div class="codice"&gt;&amp;lt;httpRuntime requestValidationMode=&amp;quot;2.0&amp;quot;/&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;In questo modo il runtime riprenderà a comportarsi come atteso, non validando la Request dove lo richiedete. &lt;/div&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=582" width="1" height="1"&gt;</description></item><item><title>Utilizzo delle Geolocation API per calcolare le distanze</title><link>http://www.devland.it/cs/blogs/alessio-vecchi/archive/2010/02/02/utilizzo-delle-geolocation-api.aspx</link><pubDate>Tue, 02 Feb 2010 08:17:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:499</guid><dc:creator>avecchi</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;b&gt;Recupero delle coordinate geografiche in una pagina WEB&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;E&amp;#39; possibile ottenere le coordinate geografiche, in javascript, utilizzando le API di geolocalizzazione(&lt;a href="http://dev.w3.org/geo/api/spec-source.html"&gt;http://dev.w3.org/geo/api/spec-source.html&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;Le coordinate possono essere recuperate dal disposito host se questo ha un GPS integrato, oppure possono essere dedotte dall&amp;#39;indirizzo IP o dalla cella GSM.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;L&amp;#39;oggetto navigator.geolocation si occupa del recupero delle informazioni geografiche dal dispositivo host.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Nell&amp;#39;esempio che segue viene chiamata la funziona getCurrentPosition a cui vengono passate callback in caso successo e quella in caso di errore,&lt;/p&gt;&lt;p&gt;Nel caso di successo&amp;nbsp; il parametro position contiene le informazioni di latitudine e longitudine.&lt;/p&gt;&lt;p&gt;&amp;nbsp; if (navigator.geolocation != null) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; navigator.geolocation.getCurrentPosition(foundLocation, noLocation);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; noLocation();&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;function foundLocation(position) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var lat = position.coords.latitude;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var lng = position.coords.longitude;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetCoordinate(lat, lng);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; //..&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;function SetCoordinate(lat, lng) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&amp;#39;.coord-latitude&amp;#39;).val(lat);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&amp;#39;.coord-longitude&amp;#39;).val(lng);&lt;br /&gt;} &lt;br /&gt;&lt;/p&gt;&lt;p&gt;function noLocation() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //..&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;Ottenute le coordinate si possono effettuare delle operazioni di ricerca geolocalizzate, ad esempio trovare il negozio più vicino in quel momento.&lt;/p&gt;&lt;p&gt;Se si hanno a disposizione un elenco di indirizzi da geolocalizzare si vogliono ottenere le coordinate si può leggere il mio post precedente:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.devland.it/cs/blogs/alessio-vecchi/archive/2009/11/16/geolocalizzazione-con-google-HTTP-service.aspx"&gt;http://www.devland.it/cs/blogs/alessio-vecchi/archive/2009/11/16/geolocalizzazione-con-google-HTTP-service.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Ottenute le coordinate dal dispositivo si può fare una chiamata POST a un WebService, che per comodità ho messo nel code behind della pagina, che restituisce la lista dei negozi ordinate per distanza decrescente.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;function StartSearch() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var lat = $(&amp;#39;.coord-latitude&amp;#39;).val();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var lng = $(&amp;#39;.coord-longitude&amp;#39;).val();&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $.ajax({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type: &amp;quot;POST&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; url: &amp;quot;/index.aspx/SearchStore&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data: &amp;quot;{&amp;#39;lat&amp;#39;: &amp;quot; + lat + &amp;quot;, &amp;#39;lng&amp;#39;:&amp;quot; + lng + &amp;quot; }&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; contentType: &amp;quot;application/json; charset=utf-8&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataType: &amp;quot;json&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; success: function(stores) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ApplyTemplate(stores);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; error: function(XMLHttpRequest, textStatus, errorThrown) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(textStatus + &amp;#39; &amp;#39; + errorThrown);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;Se la chiamata ha successo viene fatta una callback alla funzione ApplyTemplate:&lt;/p&gt;&lt;p&gt;&amp;nbsp;function ApplyTemplate(stores) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //alert(stores.d);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&amp;#39;#results&amp;#39;).setTemplateURL(&amp;#39;template/stores-result.html&amp;#39;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&amp;#39;#results&amp;#39;).processTemplate(stores);&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;che utilizza il motore jTemplate per renderizzare i dati che ci vengono restituiti in formato json. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;Il file template stores-result.html è una listing semplicissimo:&lt;/p&gt;&lt;p&gt;{#foreach $T.d as store}&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class=&amp;quot;store-item&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;(#{$T.store.store.ID}) - {$T.store.store.Name}&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;{$T.store.store.Address}&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;{#if $T.store.distance&amp;lt;1 }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {($T.store.distance*1000).toFixed(0)} metri &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {#else} {$T.store.distance.toFixed(0)} km {#/if}&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&amp;nbsp; &lt;br /&gt;{#/for} &lt;/p&gt;&lt;p&gt;&amp;nbsp;Ecco invece il codice della pagina e il code behind:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot; CodeFile=&amp;quot;index.aspx.cs&amp;quot; Inherits=&amp;quot;index&amp;quot; %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;head runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script src=&amp;quot;http://maps.google.com/maps/api/js?sensor=false&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script src=&amp;quot;script/jquery-1.3.2.min.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script src=&amp;quot;script/jquery-jtemplates.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script src=&amp;quot;index.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .address&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; width:400px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .store-item&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; background-color:#f0f0f0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; width:400px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; border-bottom:1px solid gray;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;form id=&amp;quot;form1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cerca lo store più vicino a te:&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id=&amp;quot;div-searching&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ricerca in corso...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;br /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:TextBox ID=&amp;quot;tbAddress&amp;quot; runat=&amp;quot;server&amp;quot; CssClass=&amp;quot;address&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;tbLatitude&amp;quot; class=&amp;quot;coord-latitude&amp;quot; runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;tbLongitude&amp;quot; class=&amp;quot;coord-longitude&amp;quot; runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:HyperLink ID=&amp;quot;hlSearch&amp;quot; runat=&amp;quot;server&amp;quot; NavigateUrl=&amp;quot;#&amp;quot; Text=&amp;quot;cerca&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CssClass=&amp;quot;but-cerca search-button&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id=&amp;quot;results&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Web.UI;&lt;br /&gt;using System.Web.UI.WebControls;&lt;br /&gt;using System.Web.Services;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Xml;&lt;br /&gt;using System.Xml.Linq;&lt;br /&gt;using System.Globalization;&lt;br /&gt;&lt;br /&gt;public partial class index : System.Web.UI.Page&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!Page.IsPostBack)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Draw();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void Draw()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tbAddress.Text = &amp;quot;&amp;quot;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private const double RAD = 57.295779513082323;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static double Distance(double lat1, double lng1, double lat2, double lng2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var a = Math.Sin(lat1 / RAD) * Math.Sin(lat2 / RAD);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var b = Math.Cos(lat1 / RAD) * Math.Cos(lat2 / RAD) * Math.Cos((lng2 - lng1) / RAD);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var distance = 6377.830272 * Math.Acos(a + b);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return distance;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [WebMethod()]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static IEnumerable SearchStore(double lat, double lng)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Store.Stores.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OrderBy(s =&amp;gt; Distance(s.Latitude, s.Longitude, lat, lng)).&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Select(s =&amp;gt; new { store = s, distance = Distance(s.Latitude, s.Longitude, lat, lng) });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=499" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/alessio-vecchi/archive/tags/Geolocation+API/default.aspx">Geolocation API</category><category domain="http://www.devland.it/cs/blogs/alessio-vecchi/archive/tags/Google+Maps+API/default.aspx">Google Maps API</category><category domain="http://www.devland.it/cs/blogs/alessio-vecchi/archive/tags/navigator+geolocation/default.aspx">navigator geolocation</category></item><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><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>Geolocalizzazione con Google HTTP Service</title><link>http://www.devland.it/cs/blogs/alessio-vecchi/archive/2009/11/16/geolocalizzazione-con-google-HTTP-service.aspx</link><pubDate>Mon, 16 Nov 2009 13:36:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:417</guid><dc:creator>avecchi</dc:creator><slash:comments>0</slash:comments><description>Ormai credo che a quasi tutti sia capitato di dover integrare il proprio sito web (e non) con qualche sistema di geolocalizzazione. &lt;p&gt;I motivi possono essere molteplici: dal visulizzare un punto su una mappa, al ricercare l&amp;#39;indirizzo del negozio più vicino, al calcolo del percorso tra due indirizzi, ecc,&lt;/p&gt;&lt;p&gt;Spesso capita di avere un database con un elenco di indirizzi e di volere trovare la latitudine e longitudine per poi salvarla sul database stesso.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Per prima cosa bisogna appogiarsi a un servizio esterno che permette di localizzare il nostro indirizzo in coordinate terrestri (latitudine e longitudine). &lt;/p&gt;&lt;p&gt;Per questo esempio utilizziamo il servizio di Geocoding fornito da Google:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.google.com/intl/it/apis/maps/documentation/geocoding/index.html" title="http://code.google.com/intl/it/apis/maps/documentation/geocoding/index.html" target="_blank"&gt;http://code.google.com/intl/it/apis/maps/documentation/geocoding/index.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Leggendo la documentazione si scopre che basta fare un chiamata in HTTP GET al segunete indirizzo web:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://maps.google.com/maps/geo" title="http://maps.google.com/maps/geo"&gt;http://maps.google.com/maps/geo&lt;/a&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;nella query string bisogna fornire questi parametri obbligatori: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;q (indirizzo), &lt;br /&gt;&lt;/li&gt;&lt;li&gt;key (la GoogleMap API Key), &lt;br /&gt;&lt;/li&gt;&lt;li&gt;sensor (a false), &lt;br /&gt;&lt;/li&gt;&lt;li&gt;output (il formato dell&amp;#39;output: xml, json, ecc) &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Se proviamo a fare una chiamata di prova mettendo come indirizzo milano:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://maps.google.com/maps/geo?q=milano&amp;amp;sensor=false&amp;amp;key=&amp;amp;output=xml" title="http://maps.google.com/maps/geo?q=milano&amp;amp;sensor=false&amp;amp;key=&amp;amp;output=xml"&gt;http://maps.google.com/maps/geo?q=milano&amp;amp;sensor=false&amp;amp;key=&amp;amp;output=xml&lt;/a&gt;&lt;/p&gt;&lt;p&gt;si ottiene il seguente risultato:&lt;br /&gt;&lt;/p&gt;&lt;pre id="line1"&gt;&lt;span class="pi"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;&lt;span class="start-tag"&gt;kml&lt;/span&gt;&lt;span class="attribute-name"&gt; xmlns&lt;/span&gt;=&lt;span class="attribute-value"&gt;&amp;quot;http://earth.google.com/kml/2.0&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="start-tag"&gt;Response&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;span class="start-tag"&gt;name&lt;/span&gt;&amp;gt;milano&amp;lt;/&lt;span class="end-tag"&gt;name&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;span class="start-tag"&gt;Status&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span class="start-tag"&gt;code&lt;/span&gt;&amp;gt;200&amp;lt;/&lt;span class="end-tag"&gt;code&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span class="start-tag"&gt;request&lt;/span&gt;&amp;gt;geocode&amp;lt;/&lt;span class="end-tag"&gt;request&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;span class="end-tag"&gt;Status&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;span class="start-tag"&gt;Placemark&lt;/span&gt;&lt;span class="attribute-name"&gt; id&lt;/span&gt;=&lt;span class="attribute-value"&gt;&amp;quot;p1&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre id="line9"&gt;    &amp;lt;&lt;span class="start-tag"&gt;address&lt;/span&gt;&amp;gt;Milano, Italia&amp;lt;/&lt;span class="end-tag"&gt;address&lt;/span&gt;&amp;gt;&lt;br /&gt;    [..]&lt;br /&gt;  &lt;b&gt;  &amp;lt;&lt;span class="start-tag"&gt;Point&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="start-tag"&gt;coordinates&lt;/span&gt;&amp;gt;9.1881408,45.4636889,0&amp;lt;/&lt;span class="end-tag"&gt;coordinates&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span class="end-tag"&gt;Point&lt;/span&gt;&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre id="line15"&gt;  &amp;lt;/&lt;span class="end-tag"&gt;Placemark&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;span class="end-tag"&gt;Response&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span class="end-tag"&gt;kml&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Per effettuare un HTTP GET mi appoggio a una comoda classe di utility PostSubmitter scaricabile da:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx" title="http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx"&gt;http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Ovviamente si possono usare le classi del framework .net.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;A questo punto scrivere una classa che dato un indirizzo ci fornisce la longitudine e la latitudine è una banalità:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Xml.Linq;&lt;br /&gt;using System.Configuration;&lt;br /&gt;using System.Globalization;&lt;br /&gt;&lt;br /&gt;namespace GeoLocator&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class GeoLocator&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String GoogleGeoServiceUrl = ConfigurationManager.AppSettings[&amp;quot;GoogleGeoServiceUrl&amp;quot;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String GoogleMapAPIKey = ConfigurationManager.AppSettings[&amp;quot;GoogleMapAPIKey&amp;quot;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private XNamespace GoogleNS = ConfigurationManager.AppSettings[&amp;quot;GoogleNS&amp;quot;];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public GeoLocator()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public GeoLocator(String geoServiceUrl, String mapAPIKey, String googleNS)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.GoogleGeoServiceUrl = geoServiceUrl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.GoogleMapAPIKey = mapAPIKey;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.GoogleNS = googleNS;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public GeoCoordinate GetGeoCoordinate(String address)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PostSubmitter post = new PostSubmitter();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; post.PostItems.Add(&amp;quot;q&amp;quot;, address);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; post.PostItems.Add(&amp;quot;key&amp;quot;, GoogleMapAPIKey);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; post.PostItems.Add(&amp;quot;sensor&amp;quot;, &amp;quot;false&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; post.PostItems.Add(&amp;quot;output&amp;quot;, &amp;quot;xml&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; post.PostItems.Add(&amp;quot;gl&amp;quot;, &amp;quot;.it&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; post.Url = GoogleGeoServiceUrl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; post.Type = PostSubmitter.PostTypeEnum.Get;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String xmlText = post.Post();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XDocument doc = XDocument.Parse(xmlText);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XElement coordinate =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; doc.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Descendants(GoogleNS + &amp;quot;coordinates&amp;quot;).&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FirstOrDefault();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GeoCoordinate geoCoordinate =null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (coordinate != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String[] coords = coordinate.Value.Split(&amp;#39;,&amp;#39;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; geoCoordinate = new GeoCoordinate()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Latitude = decimal.Parse(coords[0], CultureInfo.CreateSpecificCulture(&amp;quot;en-us&amp;quot;)),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Longitude = decimal.Parse(coords[1], CultureInfo.CreateSpecificCulture(&amp;quot;en-us&amp;quot;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return geoCoordinate;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class GeoCoordinate&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public decimal Latitude { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public decimal Longitude { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/p&gt;&lt;p&gt;dove l&amp;#39;App.config è così strutturato:&lt;/p&gt;&lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;appSettings&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key=&amp;quot;GoogleGeoServiceUrl&amp;quot; value=&amp;quot;http://maps.google.com/maps/geo&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key=&amp;quot;GoogleMapAPIKey&amp;quot; value=&amp;quot;&lt;i&gt;inserire la propria chiave&lt;/i&gt;&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key=&amp;quot;GoogleNS&amp;quot; value=&amp;quot;http://earth.google.com/kml/2.0&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/appSettings&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Nei file allegati al post c&amp;#39;è un esempio completo con un progetto di test che utilizza la libreria.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.devland.it/cs/blogs/alessio-vecchi/attachment/417.ashx" title="Scarica HTTPServiceGeoLocator.zip"&gt;Scarica HTTPServiceGeoLocator.zip&amp;nbsp; &lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=417" width="1" height="1"&gt;</description><enclosure url="http://www.devland.it/cs/blogs/alessio-vecchi/attachment/417.ashx" length="55573" type="application/zip" /><category domain="http://www.devland.it/cs/blogs/alessio-vecchi/archive/tags/google/default.aspx">google</category><category domain="http://www.devland.it/cs/blogs/alessio-vecchi/archive/tags/maps/default.aspx">maps</category><category domain="http://www.devland.it/cs/blogs/alessio-vecchi/archive/tags/geocoding/default.aspx">geocoding</category><category domain="http://www.devland.it/cs/blogs/alessio-vecchi/archive/tags/address/default.aspx">address</category><category domain="http://www.devland.it/cs/blogs/alessio-vecchi/archive/tags/latitude/default.aspx">latitude</category><category domain="http://www.devland.it/cs/blogs/alessio-vecchi/archive/tags/longitude/default.aspx">longitude</category></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><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><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><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><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><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><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><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>1</slash: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><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><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><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>4</slash: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><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><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><item><title>Office Business Application Architect Forum</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/01/07/office-business-application-architect-forum.aspx</link><pubDate>Mon, 07 Jan 2008 11:31:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:130</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Vi segnalo un interessante appuntamento offerto gratuitamente da Microsoft per approfondire la conoscenza delle nostre amate &lt;a class="" title="OBA Patterns" href="http://www.devland.it/cs/blogs/marco-del-gatto/archive/2007/10/18/pattern-di-utilizzo-di-office-business-application-oba.aspx"&gt;OBA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La giornata è indicata sia a chi affronta per la prima volta l’argomento e intende farsi una idea generale sia a chi intende approfondire le tematiche architetturali dei più comuni scenari delle Office Business Application.&lt;/p&gt;
&lt;p&gt;La giornata si svolgerà il &lt;strong&gt;24 gennaio 2008&lt;/strong&gt; presso la sede Microsoft di Milano.&lt;/p&gt;
&lt;p&gt;Visitate la pagina con &lt;a class="" title="Tutti i dettagli" href="http://www.microsoft.com/italy/msdn/risorsemsdn/eventi/oba.mspx" target="_blank"&gt;tutti i dettagli sull’evento&lt;/a&gt; e &lt;a class="" title="iscrizione online" href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032362254&amp;amp;Culture=it-IT" target="_blank"&gt;l’iscrizione online&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Marco.&lt;/p&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=130" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/OBA/default.aspx">OBA</category></item><item><title>Snippet Property per Visual Studio 2008</title><link>http://www.devland.it/cs/blogs/code-island/archive/2008/01/07/snippet-property-per-visual-studio-2008.aspx</link><pubDate>Mon, 07 Jan 2008 08:56:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:129</guid><dc:creator>ReadOnly</dc:creator><slash:comments>0</slash:comments><description>&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;font face="Calibri" size="3"&gt;In VS 2008 lo snippet &lt;strong&gt;prop&lt;/strong&gt; di C# crea una property con getter e setter vuoti e si mangia il membro privato, che in VS2005 veniva creato. Lo snippet proposto (da copiare sotto &lt;em&gt;C:\&amp;lt;Program Files&amp;gt;\Microsoft Visual Studio 9.0\VC#\Snippets\1033\Una delle cartelle presenti&lt;/em&gt;, oppure una qualsiasi delle cartelle configurate in &lt;em&gt;Tools&lt;/em&gt;/&lt;em&gt;Code Snipper Manager&lt;/em&gt;, e che si abilita all&amp;#39;avvio successivo di VS) crea la property col membro privato e relativi getter e setter pubblici, dando per scontato che il suo nome sia &lt;strong&gt;_&amp;lt;nome&amp;gt;&lt;/strong&gt;. Lo snippet si attiva con &lt;strong&gt;propm&lt;/strong&gt;.&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;font face="Calibri" size="3"&gt;Piccolo hint: tra le estensioni di C# adesso è possibile mettere modificatori a &lt;strong&gt;get&lt;/strong&gt; e &lt;strong&gt;set&lt;/strong&gt; per renderli privati o protetti. Così per consentire alle classi derivate l’accesso in scrittura a proprietà che all’esterno devono essere in sola lettura non è più necessario far diventare &lt;strong&gt;protected&lt;/strong&gt; il membro privato.&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=129" width="1" height="1"&gt;</description><enclosure url="http://www.devland.it/cs/blogs/code-island/attachment/129.ashx" length="580" type="application/x-zip-compressed" /><category domain="http://www.devland.it/cs/blogs/code-island/archive/tags/.net/default.aspx">.net</category><category domain="http://www.devland.it/cs/blogs/code-island/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item></channel></rss>
