di .NET e di altre amenità

ASP.NET 2.0: ObjectDataSource e conversioni di tipi. Siamo certi che funziona?

Abbiate pazienza, non è mia abitudine lamentarmi, ma stavolta lo sbottare ci sta davvero tutto. Ma prima del fatto è bene che vi racconti l'antefatto. Stasera, io e il collega Andrea Dottor ci siamo scontrati con un comportamento apparentemente inspiegabile. Un pezzo di codice apparentemente perfetto falliva miseramente e inspiegabilmente. In buona sostanza quello che stavamo facendo era tutto sommato semplice; Un campo di tipo Textbox riceveva una stringa in che rappresentava una valuta, per la precisione "0,5" in seguito tale stringa arrivava al validatore serverside che utilizzando decimal.TryParse() verificava che si trattasse effettivamente di un decimal. Questo controllo, applicato sia con la CultureInfo che senza veniva eseguito perfettamente restituendo un chiaro e lampante "true". Tuttavia, pochi millisecondi dopo, quando la datasource tentava di mappare i campi su un oggetto di business, l'operazione miseramente scoppiava, con il seguente errore: "0,5" is not a valid value for Decimal.

Alla fine, solo analizzanto il codice del framework linea per linea con Reflector siamo giunti a capire il motivo per cui questa banale operazione scoppiava:

private static object ConvertType(object value, Type type, string paramName)
{
      
string text1 = value as string;

      
if (text1 != null)
      {
            TypeConverter converter1 = TypeDescriptor.GetConverter(type);

            
if (converter1 == null)
            {
                
return value;
            }
            
try
            
{
                
value = converter1.ConvertFromInvariantString(text1);
            }
            
catch (NotSupportedException)
            {
                
throw new InvalidOperationException(
                    SR.GetString("ObjectDataSourceView_CannotConvertType", 
                        
new object[] { paramName, typeof(string).FullName, type.FullName }));
            }
            
catch (FormatException)
            {
                
throw new InvalidOperationException(
                    SR.GetString("ObjectDataSourceView_CannotConvertType", 
                        
new object[] { paramName, typeof(string).FullName, type.FullName }));
            }
      }
      
return value;
}

Questo codice, estratto dalla classe ObjectDataSourceView è la causa del misfatto e precisamente la riga che chiama il metodo ConvertFromInvariantString() del TypeConverter. La ObjectDataSourceView, per inciso, è l'oggetto che all'interno della ObjectDataSource si incarica di effettuare le operazioni incapsulando al suo interno una rappresentazine dello storage. La chiamata a ConvertFromInvariantString() scritta in questo modo impone che un dato decimal, ma con tutta probabilità anche una data o un double, debba essere formattato con cultura neutra, e cioè nel nostro caso con il punto al posto della virgola. Una chiamata corretta sarebbe stata la seguente:

value = converter1.ConvertFromString(null, CultureInfo.CurrentCulture, text);

In questo modo la datasource avrebbe tenuto conto della cultura corrente e quindi si sarebbe adeguata al contesto del thread, consentendo alla conversione di avvenire correttamente. Ora, purtroppo i metodi in questione sono privati e perciò non è possibile porre rimedio a questo problema cercando di sostituire la ObjectDataSourceView con un oggetto che sia stato patchato. In realtà credo di avere un'idea per una soluzione, che però tenterò domattina, ma lasciatemi dire che un errore del genere non me lo sarei mai aspettato.

powered by IMHO 1.3

 

ARTICOLO: Un HeaderTemplate per la GridView

L'uso di WebControls di tipo Template può dare al nostro codice una flessibilità molto marcata. In questo articolo, cogliendol'occasione di aggiungere una nuova feature alla GridView, si esplora con dovizia di particolari il meccanismo di funzionamento dei Template. Ora è tardi e me ne vado a dormire... (2:49)

Link: http://www.xedotnet.org/blogs/articoli/archive/2006/05/30/gridview_header.aspx

powered by IMHO 1.3

TFS installato... anche se con qualche inghippo!

Beh, alla fine ci sono riuscito e dopo una giornata densa di attività, partendo da una macchina pulita pulita ho installato nell'ordine Windows 2003, patch varie, Sql Server 2005, altre patch, Sharepoint services, e infine l'agognato Team Foundation Server. Ora tocca configurarlo, ma lasciatemi dire una cosa: bella li, mica la si poteva fare un po' più semplice?

Ora, dopo questo sfogo permettetemi un consiglio. Se intendete ripetere l'epica impresa, prendetevi la guida di installazione, e seguitela passo passo, nel preciso ordine, senza trascurare nemmeno una virgola. Non azzardatevi ad improvvisare nulla, e allenatevi prima su una virtual machine se ne avete la possibilità. E' l'unica speranza che tutto fili liscio e che alla fine, il setup vi saluti con un bonario: "che culo, ti è andata bene!"

Scherzi a parte, prima che qualcuno mi salti alla gola per tentato sacrilegio mi affretterò a dirvi che tutto sommato sono stato favorevolmente impressionato da quello che ho trovato non appena ho aperto il team explorer. A parte il fatto che, qualora non abbiate installato Visual Studio 2005 il setup provvede ad installarne una versione light giusto per potervi mostrare il team explorer, a prima vista l'ambiente è appare veramente semplice e familiare. Voci di menu chiare, una struttura intuitiva e delle schermate davvero semplici ed autoesplicative. Il passo successivo è stato quello di installare il Team Explorer sul mio pc client, e vederlo integrato perfettamente all'interno del mio amato IDE. Le difficoltà si sono presentate quando è venuto il momento di collegarsi al server, semplicemente perchè, quando ho completato l'installazione mi sono illuso di poter chiudere la documentazione e potermela cavare da solo. Invece c'è voluto un po' a capire che TFS usa dei gruppi di sicurezza interni uno dei quali, quello dei licensed users, è quello che consente l'accesso agli utenti al sistema. Coloro che non fanno parte di questo gruppo non possono accedere a TFS e, per inciso, se come me avete la Workgroup Edition dentro questo gruppo non potrete metterci più di 5 utenti, ottenendo così a tutti gli effetti una limitazione nell'uso del server. Dato che la propria identità all'interno di un progetto è a dir poco vitale è evidente che non sarà proprio possibile aggirare in alcun modo il limite.

Per concludere, permettetemi di lasciarvi con un ulteriore consiglio. Lo so che quello che dirò apparirà del tutto ovvio ma credetemi, quando questa cosa mi è successa non era esattamente lampante. Nel gruppo degli utenti con licenza è presente anche l'utente con cui effettuate il setup. Quello che nella documentazione vi viene consigliato di chiamare TFSSETUP e al quale dovrete dare i diritti di amministratore. Ovviamente se il vostro team è composto da esattamente cinque persone vorrete come me garantire l'accesso ai loro utenti di rete, e come me probabilmente vorrete rimuovere l'utente di installazione dal gruppo in questione. Vi dirò, quando ho fatto questo ho sentito per un attimo quel sottile brivido che bene o male tutti conoscete e che viene quando si ha la netta impressione di averla combinata grossa. L'effetto immediato, quando premente OK è quello di essere disconnessi istantaneamente, senza nemmeno darvi la possibilità di tornare sui vostri passi. Ed è proprio la che il brivido acquisirà la consistenza di una terribile certezza. Soprattutto se, prima di compiere l'incauta azione vi sarete dimenticati di concedere al vostro utente di rete i diritti di amministratore su tfs. Ascoltatemi, io ve l'avevo detto di allenarvi su una virtual machine... non prendetevela con me, ma dopo questa furbata vi sarete persi il controllo del server... aaarrrggghhh!!!!!

powered by IMHO 1.3

I 5 modi peggiori di usare RSS

Questo è proprio divertente:

http://inkblots.markwoodman.com/2006/04/28/top-5-worst-uses-of-rss-and-atom/

Chissa se riesco a convincere mia nonna ad installarsi un Pacemaker Feed.

powered by IMHO 1.3

parachute

Someone is preparing his parachute. This person went to the beach to open his yellow parachute probably preparing it for next activities - Nikon D70s - 70/300mm

next | previous

Solitude

next | previous

solitude on a beach

Nikon D70s - 70-300

Perchè, Signore, hai taciuto?

Così ha avuto il coraggio di esclamare quest'oggi papa Ratzinger. Ma con quale coraggio può pronunciare tale quesito che suppongo agli orecchi di molti cattolici deve essere suonato alla stregua di una bestemmia. Forse nessuno si è reso conto dell'arroganza di tale posizione: è stata forse colpa del Signore se il nazismo ha fatto quello che ha fatto? E' stata forse colpa del silenzio del Signore se milioni di persone sono state sterminate?

No, mi permetta papa Ratzinger di ricordargli che sono stati altri i silenzi, codardi, che hanno fatto in modo che il Nazismo potesse crescere, e esplodesse nel disastro che poi si è rivelato. I silenzi dell'uomo innanzitutto, quegli stessi silenzi che hanno coperto per anni personaggi del calibro di Saddam Hussein e che oggi ci riprovano con il tiranno dell'Iran. I silenzi colpevoli, della chiesa, nella persona dell'allora papa Pio XII, che durante tutta la guerra si è ben guardato dal denunciare quanto stava succedendo.

E' colpa del Signore? Mi spiace, io non sono cattolico per mia fortuna, ma le bestemmie mi infastidiscono lo stesso. Soprattutto se proferite da chi vorrebbe fregiarsi della rappresentanza di Dio in terra.

powered by IMHO 1.3

Adj. 1) Impossible to repress or control. Irrepressible!

Mi sono appena iscritto a questo sito che promette bene. Si tratta, di un idea di Amnesty International che con il supporto di The Observer intende portare l'attenzione sulla censura in rete. Ecco come si descrive il sito in home page:

Chat rooms monitored. Blogs deleted. Websites blocked. Search engines restricted. People imprisoned for simply posting and sharing information. The Internet is a new frontier in the struggle for human rights. Governments – with the help of some of the biggest IT companies in the world – are cracking down on freedom of expression. Amnesty International, with the support of The Observer, is launching a campaign to show that online or offline the human voice and human rights are impossible to repress.

Sapete bene quanto mi stiano a cuore questi argomenti e capirete bene perchè ho deciso di aggiungere nella barra laterale del mio weblog l'interessante gadget che fornisce irrepressible . Si tratta di un roller che mostra a rotazione le frasi censurate in varie occasioni da paesi totalitari e non totalitari. La fanno da padrone naturalmente i paesi arabi come Siria, Iran e naturalmente non possono mancare Cina e Cuba.

powered by IMHO 1.3

bocca di porto

Punta Sabbioni - Nikon D70s - 70/300mm

next | previous

ASP.NET 2.0: Uno StaticSiteMapProvider molto flessibile

Su xe.net è apparso il mio secondo articolo che questa volta porta con se un componente riutilizzabile da non perdere. Si tratta di un SiteMapProvider che semplifica enormemente la creazione di provider custom che attingano i dati della mappa da una qualsiasi sorgente. Nell'esempio allegato all'articolo oltre al codice di questo StaticSiteMapProvider che risolve i problemi di concorrenza che affliggono queste implementazioni, anche un semplice provider alimentato da database SqlServer

Link: Uno StaticSiteMapProvider molto flessibile

Con l'occasione ho anche postato il secondo screencast dedicato al pattern singleton

SCREENCAST: Implementare un Sigleton in C#

Community Credit: Sono negli "All Time Earners"

Sono lieto di comunicare che sono appena stato inserito nella classifica delle 15 più attive di tutti i tempi all'interno di community credit. Precisamente mi trovo attualmente al 14“ posto in questa classifica, mentre nella classifica mensile mi qualifico secondo (per ora!)

Andrea Boschin (136525)

http://www.community-credit.com

ASP.NET 2.0: Collections di ConfigurationElement

Continuo sull'argomento System.Configuration, proponendovi un esempio di come creare una collection di ConfigurationElement custom. Per capire l'applicazione dell'esempiuo che sto per introdurre bisogna una ttimo soffermarsi su una particolare tipologia di elementi di configurazione. Mi riferisco ad esempio al nodo <providers> all'interno di una sezione di configurazione di MembershipProvider piuttosto che magari la sezione dedicata ad httpHandler e httpModules. All'interno di questo tipo di sezioni è possibile aggiungere elementi, ma anche rimuoverne con le seguenti sintatti:

<add />

<remove />

<clear />

Nel framework 2.0 questo tipo di sezioni sono perfettamente definibili da parte dell'utente implementando una ConfigurationElementCollection. Si tratta in breve di estendere una classe del framework, implementando un certo numero di metodi: nell'esempio che riporto qui di seguito ecco come realizzare la versione base che accetterà l'aggiunta di nuovi elementi con <add />

public class ApplicationInfoCollection : ConfigurationElementCollection
{
    
protected override ConfigurationElement CreateNewElement()
    {
        
return new ApplicationInfo();
    }

    
protected override object GetElementKey(ConfigurationElement element)
    {
        
return ((ApplicationInfo)element).Name;
    }
}

Con queste poche righe di codice avremo definito una sezione di configurazione che accetta tutte le chiavi che abbiamo elencato poco fa, attribuendo loro la funzionalità che ci aspetteremo. In particolare i due metodi si occupano di creare una nuova istanza di elemento per la collection e di restituire il valore della proprietà considerata chiave all'interno di esso. Questo consente oltre che creare gli elementi con <add /> anche di rimuoverli specificando a quale di essis ci si riferisce. Non rimane ora che esporre una proprietà in una classe:

/// <summary>
/// 
Applicazioni registrate
/// </summary>
[ConfigurationProperty("applications", IsDefaultCollection = false)]
[ConfigurationCollection(
typeof(ApplicationInfo))]
public ApplicationInfoCollection Applications
{
    
get return (ApplicationInfoCollection)this["applications"]; }
    
set this["applications"] = value; }
}

Il primo attributo informa che ci stiamo riferendo ad una proprietà di configurazione che quindi avrà un corrispondente elemento nel file di configurazione. L'elemento in questo caso si chiamerà <applications>. Il secondo attributo invece consente di dire quale tipo di di elemento contiene la collection; Questo in effetti può sembrare ridondante... ma di questo non prendetevela con me.

powered by IMHO 1.3