ASP.NET http://blogs.ugidotnet.org/rgm/category/ASP.NET.aspx ASP.NET it-IT Gian Maria Ricci Subtext Version 2.6.0.0 jQuery tip #3 &ndash; dialogare con un webservice http://blogs.ugidotnet.org/rgm/archive/2009/05/15/jquery-tip-3-ndash-dialogare-con-un-webservice.aspx <p>La potenza di jQuery risiede principalmente nel rendere semplice manipolare un oggetto complesso come il DOM. La chiave di jQuery è quindi quella di dialogare con il server, invocando operazioni ed aggiornando l’interfaccia, senza effettuare postback ed inviando solamente i dati minimali.</p> <p>Esistono molti modi per dialogare con il server, ad esempio grazie ad asp.net ajax è semplicissimo invocare una funzione contenuta in un webservice .asmx. Il vantaggio di usare un asmx è che potete direttamente inserirlo nel sito, in questo modo anche la security standard di asp.net vi protegge dall’uso indesiderato. Se ad esempio chiedete il servizio con la richiesta </p> <div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:f7306272-97de-45df-874d-35ed28b16da6" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">http:</span><span style="color: #000000;">//</span><span style="color: #000000;">localhost:</span><span style="color: #800080;">21963</span><span style="color: #000000;">/</span><span style="color: #000000;">Login.aspx?ReturnUrl</span><span style="color: #000000;">=</span><span style="color: #000000;">%2fMyService.asmx</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Il server vi chiede correttamente la login perché il servizio è protetto, quindi abbiamo la stessa garanzia di sicurezza di una normale pagina. Supponiamo ora di avere nel servizio la funzione:</p> <div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:a1fc0c73-6870-4593-86b5-5c430fae214b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">[WebService(Namespace </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">http://blogs.ugidotnet.org/rgm/jQueryTip/</span><span style="color: #800000;">"</span><span style="color: #000000;">)] [WebServiceBinding(ConformsTo </span><span style="color: #000000;">=</span><span style="color: #000000;"> WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(</span><span style="color: #0000FF;">false</span><span style="color: #000000;">)] [System.Web.Script.Services.ScriptService] </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> MyService : System.Web.Services.WebService { [WebMethod] </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> GetLoggedUser() { </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> Membership.GetUser().UserName; } }</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Come vedete non è altro che un webservice standard che può essere chiamato da client grazie all’attributo ScriptService, e l’unica funzione presente recupera l’utente attualmente loggato, a questo punto grazie allo ScriptManager di asp.net ajax si può chiamare questa funzione da javascript , ecco il codice della pagina Auth1.aspx</p> <div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:e7cb5e02-4b9c-4c36-94f1-a1a2315a8518" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">body</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">form </span><span style="color: #FF0000;">id</span><span style="color: #0000FF;">="form1"</span><span style="color: #FF0000;"> runat</span><span style="color: #0000FF;">="server"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">asp:ScriptManager </span><span style="color: #FF0000;">ID</span><span style="color: #0000FF;">="ScriptManager1"</span><span style="color: #FF0000;"> runat</span><span style="color: #0000FF;">="server"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Scripts</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">asp:ScriptReference </span><span style="color: #FF0000;">Path</span><span style="color: #0000FF;">="~/jQuery/jquery-1.3.2.js"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">asp:ScriptReference </span><span style="color: #FF0000;">Path</span><span style="color: #0000FF;">="~/jQuery/jqueryext.js"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">asp:ScriptReference </span><span style="color: #FF0000;">Path</span><span style="color: #0000FF;">="~/scripts/Auth1.js"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">Scripts</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Services</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">asp:ServiceReference </span><span style="color: #FF0000;">Path</span><span style="color: #0000FF;">="~/MyService.asmx"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">Services</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">asp:ScriptManager</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">div</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">input </span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">="button"</span><span style="color: #FF0000;"> class</span><span style="color: #0000FF;">="askname"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="loggedusername"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">&gt;&lt;/</span><span style="color: #800000;">input</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">input </span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">="text"</span><span style="color: #FF0000;"> class</span><span style="color: #0000FF;">="askname"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">&gt;&lt;/</span><span style="color: #800000;">input</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">form</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000FF;">&gt;</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p /> <p /> <p>Come si può vedere ci sono solamente due controlli, un bottone ed una texbox, ma sono controlli html, senza attribute runat=”server”, e quindi sono completamente ignorati da asp.net.Ora si vuole creare una funzione che alla pressione del bottone, metta nella textbox il nome dell’utente loggato. </p> <p>Notate come nello scriptmanager sia stato inserito un riferimento al webservice precedentemente mostrato e sono stati inclusi gli script javascript, i primi due sono la libreria jQuery ed una libreria di estensioni, il terzo è lo script che realizza la logica della pagina.</p> <div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:34b7ee6d-cc54-45b7-ac73-db4a2cf8ea79" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">(</span><span style="color: #0000FF;">function</span><span style="color: #000000;">() { $(</span><span style="color: #000000;">'</span><span style="color: #000000;">.askname</span><span style="color: #000000;">'</span><span style="color: #000000;">).log(</span><span style="color: #000000;">'</span><span style="color: #000000;">button</span><span style="color: #000000;">'</span><span style="color: #000000;">).click(</span><span style="color: #0000FF;">function</span><span style="color: #000000;">() { SampleSite.MyService.GetLoggedUser( </span><span style="color: #0000FF;">function</span><span style="color: #000000;">(result, context, method) { $(context).siblings(</span><span style="color: #000000;">'</span><span style="color: #000000;">input</span><span style="color: #000000;">'</span><span style="color: #000000;">).val(result); }, </span><span style="color: #0000FF;">function</span><span style="color: #000000;">(error, context, method) { alert(</span><span style="color: #000000;">'</span><span style="color: #000000;">Exception during the save.</span><span style="color: #000000;">'</span><span style="color: #000000;">); }, </span><span style="color: #0000FF;">this</span><span style="color: #000000;">); }); });</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Come si può vedere basta aggiungere un handler click() al bottone, alla pressione dello bottone si chiama quindi il webservice, proprio come se la classe del webservice fosse definita nel javascript (in effetti lo script manager vi genera uno script con tutta la definizione). La chiamata accetta tutti i parametri della funzione originale (in questo caso nessuno), e di seguito tre parametr:, la funzione da chiamare in caso di successo, quella da chiamare in caso di fallimento ed un oggetto che viene ripassato alle precedenti due funzioni nel campo context. In caso di successo non si fa altro che individuare la textbox grazie alla funzione jQuery siblings, e modificarne il contenuto. Come si può vedere il bottone premuto, era stato passato come ultimo parametro alla funzione GetLoggedUser(), per cui lo ritroviamo nel parametro context delle funzioni di callback. </p> <p><a href="http://www.nablasoft.com/alkampfer/itablog/jquerytip3.zip">Il codice è contenuto qui</a>.</p> <p>Alk.</p> <p>Tags: <a href="http://technorati.com/tag/jQuery" rel="tag">jQuery</a> <a href="http://technorati.com/tag/asp.net ajax" rel="tag">asp.net ajax</a></p><img src="http://blogs.ugidotnet.org/rgm/aggbug/96201.aspx" width="1" height="1" /> Gian Maria Ricci http://blogs.ugidotnet.org/rgm/archive/2009/05/15/jquery-tip-3-ndash-dialogare-con-un-webservice.aspx Fri, 15 May 2009 12:10:13 GMT http://blogs.ugidotnet.org/rgm/archive/2009/05/15/jquery-tip-3-ndash-dialogare-con-un-webservice.aspx#feedback 2 http://blogs.ugidotnet.org/rgm/comments/commentRss/96201.aspx http://blogs.ugidotnet.org/rgm/services/trackbacks/96201.aspx Jquery che potenza http://blogs.ugidotnet.org/rgm/archive/2008/08/19/93749.aspx <p>Dopo avere letto il libro JQuery in Action (che caldamente consiglio a tutti coloro che sviluppano web) ho iniziato a usare le prime istruzioni JQuery.. e debbo dire che rimango affascinato da come semplifichi la vita nella gestione delle classiche funzionalità ajax di un sito. Decisamente una libreria molto utile e potente.</p> <p>alk.</p><img src="http://blogs.ugidotnet.org/rgm/aggbug/93749.aspx" width="1" height="1" /> Gian Maria Ricci http://blogs.ugidotnet.org/rgm/archive/2008/08/19/93749.aspx Tue, 19 Aug 2008 16:24:57 GMT http://blogs.ugidotnet.org/rgm/archive/2008/08/19/93749.aspx#feedback 2 http://blogs.ugidotnet.org/rgm/comments/commentRss/93749.aspx http://blogs.ugidotnet.org/rgm/services/trackbacks/93749.aspx L'importanza dei documenti di Deploy http://blogs.ugidotnet.org/rgm/archive/2008/07/25/93526.aspx <p>Fare un deploy di una applicazione non sempre è semplice, soprattutto se realizzata da vari sviluppatori, ogniuno dei quali gestisce parti che hanno bisogno di settaggi particolari, permessi particolari, file in alcune cartelle etc etc.</p> <p>Per questa ragione è necessario fare un documento che spiega in maniera dettagliata le procedure che si debbono seguire per effettuare il deploy di un sito.</p> <p>Purtroppo ieri, non per la prima volta, mi capita di guardare un sito che ha gravi problemi di performance, fino a generare talvolta degli OutOfMemoryException, si va nel web.config e ci si trova</p> <p> </p><div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:41bd433c-4832-47b6-9d68-c4731c71062b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #000000;">&lt;</span><span style="color: #000000;">trace enabled</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">true</span><span style="color: #800000;">"</span><span style="color: #000000;"> pageOutput</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">false</span><span style="color: #800000;">"</span><span style="color: #000000;"> requestLimit</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">10000</span><span style="color: #800000;">"</span><span style="color: #000000;"> localOnly</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">true</span><span style="color: #800000;">"</span><span style="color: #000000;">/&gt;</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Oltre al classico debug="true".</p> <p>Questo errore purtroppo è più tipico di quello che si pensa. Quando si mette un sito in produzione bisogna prima di tutto compilare tutti gli assembly in modalità Release, e poi bisogna assicurarsi che debug="false" e anche che il trace sia disabilitato. </p> <p>La morale è che non si può mettere un sito in produzione con gli stessi settaggi che si usano durante lo sviluppo e poi meravigliarsi se ci sono problemi di performance, il deploy dei siti asap.net è una operazione che spesso viene fatta in modalita xcopy, ma non va assolutamente bene. Per la sicurezza è necessario fare un utente specifico sotto cui far girare sia il webserver che il worker process asp.net, dare a quell'utente solo i permessi minimi (e questi debbono essere specificati nel documento di deploy), non mettere le stringhe di connessione ai sql server con nome utente e password ma usare l'autenticazione integrata etc etc.</p> <p>In sostanza, un deploy di una applicazione asp.net è una operazione delicata e va stilato un documento, anche informale, affinche chiunque possa effettuarlo senza introddure buchi di sicurezza o mettere online un sito che, come si dice dalle mie parti, <em>non si strascina :D</em></p> <p>alk.</p> <div class="wlWriterSmartContent" id="scid:C16BAC14-9A3D-4c50-9394-FBFEF7A93539:3f60f9ed-fee2-4be6-9eae-a579ff4273a9" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><!--dotnetkickit--></div><img src="http://blogs.ugidotnet.org/rgm/aggbug/93526.aspx" width="1" height="1" /> Gian Maria Ricci http://blogs.ugidotnet.org/rgm/archive/2008/07/25/93526.aspx Fri, 25 Jul 2008 10:51:19 GMT http://blogs.ugidotnet.org/rgm/archive/2008/07/25/93526.aspx#feedback http://blogs.ugidotnet.org/rgm/comments/commentRss/93526.aspx http://blogs.ugidotnet.org/rgm/services/trackbacks/93526.aspx Oggi giornata strana http://blogs.ugidotnet.org/rgm/archive/2008/04/23/92339.aspx <p>In un progetto web ad un certo punto vedo che in una certa pagina il layout è tutto sballato, la pagina in questione ha una funzione che renderizza dell'html dentro una label, cosi penso che la funzione sia sbagliata.</p> <p>Vado in debug e non trovo nulla di strano, fino a che non mi rendo conto che dal database arriva una stringa di testo che visivamente ha tipo un 250 caratteri ma la sua length è 989.......guardate che caratteri contiene ad un certo punto</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/rgm/WindowsLiveWriter/Oggigiornatastrana_CF34/image_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="223" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/rgm/WindowsLiveWriter/Oggigiornatastrana_CF34/image_thumb_1.png" width="508" border="0" /></a> </p> <p>In sostanza il carattere dal 260 al 265 sono una serie di nothing ... se faccio un Text.Encoding.Unicode.GetBytes(previewData) e vado a vedere attorno alla posizione incriminata trovo</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/rgm/WindowsLiveWriter/Oggigiornatastrana_CF34/image_6.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="249" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/rgm/WindowsLiveWriter/Oggigiornatastrana_CF34/image_thumb_2.png" width="464" border="0" /></a> </p> <p>L'array di byte restituito da Text.Encoding.Unicode.GetBytes(previewData) ha 1978 caratteri ed è giusto visto che la lunghezza della stringa la da com e989, peccato che internamente ci siano una sequenza di zeri e dato che 00 00 è il terminatore stringa unicode, purtroppo la stringa viene gestita male e crea casino con l'update panel. Se infatti vado a vedere nel fiddler cosa viene passato trovo questo pezzetto </p> <blockquote> <p>"<em>completa \ÿ\\ÿ\\ÿ\\ÿ\\ÿ\\ÿ\Dal primo</em>" </p> </blockquote> <p>Ovvero ci sono dei caratteri che nemmeno il fiddler riesce a renderizzare, questo significa che poi il javascript dell'update panel probabilmente va in errore dato che gli arriva uno stream di caratteri non validi......</p> <p>A qualcuno è già capitato?? </p> <p>Alk.</p><img src="http://blogs.ugidotnet.org/rgm/aggbug/92339.aspx" width="1" height="1" /> Gian Maria Ricci http://blogs.ugidotnet.org/rgm/archive/2008/04/23/92339.aspx Wed, 23 Apr 2008 15:47:51 GMT http://blogs.ugidotnet.org/rgm/archive/2008/04/23/92339.aspx#feedback 1 http://blogs.ugidotnet.org/rgm/comments/commentRss/92339.aspx http://blogs.ugidotnet.org/rgm/services/trackbacks/92339.aspx Attenzione ai formati delle date http://blogs.ugidotnet.org/rgm/archive/2008/02/06/91052.aspx <p>Spesso mi capita di vedere persone alle prese con problemi di formato di date, in particolare nelle applicazioni web. Nello specifico ci sono cose che sconsiglio vivamente, come ad esempio memorizzare le date in un database in un campo varchar. I Campi DateTime e soprattutto il tipo di dato DateTime serve a gestire le date, per cui sempre meglio usare quello che usare stringhe. </p><p>Quando la conversione in stringa è inevitabile, come ad esempio quando dovete passare date tramite querystring, un altro errore comune è quello di usare il ToString() e poi il Parse o TryParse, il problema deriva dal fatto che in asp.net la cultura dell'UI può essere impostata in modo che sia la stessa della lingua del browser utilizzato, se convertite una data in stringa da un thread della ui, la salvate da qualche parte e poi magari la riprendete da un servizio che esegue task in background ecco che sorgono problemi, perché il servizio utilizzerà per default i formati della lingua impostata nella macchina. Ricordate quindi di convertire le date in stringa e viceversa sempre con lo stesso formato. La soluzione è utilizzare sempre uno stesso formato, cosa molto semplice se si ricorda che il ToString ha un metodo in overload che accetta un IFormatProvider </p><p><span style="font-family:Consolas"><span style="color:#2b91af">String</span><span style="color:black"> converted;<br />System.Threading.</span><span style="color:#2b91af">Thread</span><span style="color:black">.CurrentThread.CurrentCulture = </span><span style="color:#2b91af">CultureInfo</span><span style="color:black">.CreateSpecificCulture(</span><span style="color:#a31515">"IT-it"</span><span style="color:black">);<br />converted = now.ToString();<br />System.Threading.</span><span style="color:#2b91af">Thread</span><span style="color:black">.CurrentThread.CurrentCulture = </span><span style="color:#2b91af">CultureInfo</span><span style="color:black">.CreateSpecificCulture(</span><span style="color:#a31515">"EN-en"</span><span style="color:black">);<br /></span><span style="color:#2b91af">DateTime</span><span style="color:black"> parsed;<br /></span><span style="color:blue">try</span><span style="color:black"> {<br />   parsed = </span><span style="color:#2b91af">DateTime</span><span style="color:black">.Parse(converted);<br />   </span><span style="color:#2b91af">Console</span><span style="color:black">.WriteLine(parsed);<br />} </span><span style="color:blue">catch</span><span style="color:black"> (</span><span style="color:#2b91af">FormatException</span><span style="color:black"> fex) {<br />   </span><span style="color:#2b91af">Console</span><span style="color:black">.WriteLine(</span><span style="color:#a31515">"Impossibile convertire {0} in data"</span><span style="color:black">, converted);<br />}<br /> <br />System.Threading.</span><span style="color:#2b91af">Thread</span><span style="color:black">.CurrentThread.CurrentCulture = </span><span style="color:#2b91af">CultureInfo</span><span style="color:black">.CreateSpecificCulture(</span><span style="color:#a31515">"IT-it"</span><span style="color:black">);<br />converted = now.ToString(</span><span style="color:#2b91af">CultureInfo</span><span style="color:black">.InvariantCulture);<br />System.Threading.</span><span style="color:#2b91af">Thread</span><span style="color:black">.CurrentThread.CurrentCulture = </span><span style="color:#2b91af">CultureInfo</span><span style="color:black">.CreateSpecificCulture(</span><span style="color:#a31515">"EN-en"</span><span style="color:black">);<br />parsed = </span><span style="color:#2b91af">DateTime</span><span style="color:black">.Parse(converted, </span><span style="color:#2b91af">CultureInfo</span><span style="color:black">.InvariantCulture);<br /></span><span style="color:#2b91af">Console</span><span style="color:black">.WriteLine(</span><span style="color:#a31515">"{0:D}"</span><span style="color:black">, parsed);<br /></span><span style="color:#2b91af">Console</span><span style="color:black">.ReadKey(); </span></span></p><p>Nello snippet si fa vedere cosa succede se si converte una data in stringa e poi cambia la cultura del thread, la seconda parte dello snippet invece utilizza la cultura invariante, per cui qualsiasi sia la cultura corrente per il thread il formato non cambia e la data può essere convertita da e in una stringa senza problemi. </p><p>Alk.</p><img src="http://blogs.ugidotnet.org/rgm/aggbug/91052.aspx" width="1" height="1" /> Gian Maria Ricci http://blogs.ugidotnet.org/rgm/archive/2008/02/06/91052.aspx Wed, 06 Feb 2008 20:47:48 GMT http://blogs.ugidotnet.org/rgm/archive/2008/02/06/91052.aspx#feedback 2 http://blogs.ugidotnet.org/rgm/comments/commentRss/91052.aspx http://blogs.ugidotnet.org/rgm/services/trackbacks/91052.aspx