Community Meeting: .netTiers & Code Generation

by andrea 08 May 2009 00:55

netTiersLogo Ricordo a tutti, che questa sera si terrà il community meeting .netTiers & Code Generation tenuto da Davide Senatore. L'evento si terrà presso il Novotel di Mestre alle ore 19:00.

Per chi come me non conosce .netTiers, consiglio la lettura degli ultimi due post scritti da Davide Senatore:

devo ammettere che la lettura di questi post ha aumentato il mio interesse sull'argomento, e chissà che Davide riesca ad allontanare lo scetticismo che ho verso questo genere di tool.

Non ci rimane che darci appuntamento a questa sera.
Vi ricordo a tutti che dopo il meeting, continueremo la serata presso "lo scarpon" sempre a Mestre... e un bel disco volante non me lo leva nessuno. :-D

Tags: , ,

ASP .NET | .NET | XeDotNet

XeDotNet, prossimi eventi da non perdere

by andrea 27 April 2009 03:22

.NET Micro Framework

logo_NMFIl 4 maggio 2009, Mirco Vanini terrà il primo evento online (per noi di XeDotNet) dal titolo ".NET Micro Framework"

Di recente introduzione, il Micro Framework è uno strumento che apre la strada a molte opportunità di lavoro in campi un tempo riservati a piattaforme molto variegate ed eterogenee. Con Mirco Vanini in questo meeting online della durata di un'ora circa esploreremo le basi del Micro Framework e le sue possibilità.

Il format dell'evento online è per noi una novità, e ci auguriamo abbia successo, in quanto agevola la partecipazione di chi non abita nelle vicinanze e fosse comunque interessato a seguire l'argomento.

Per partecipare all'evento è sufficiente registrarsi al seguente link: registrazione.

 

NetTiers & Code Generation: Rapid Application Prototyping

netTiersLogo Davide Senatore terrà l'8 maggio 2008 una sessione dal titolo "NetTiers & Code Generation: Rapid Application Prototyping".

Per chi non sapesse cos'è NetTiers, riporto parte dell'abstract della sesisone, dove è ben spiegato:

NetTiers è un insieme di templates di CodeSmith che aiutano lo sviluppatore a generare un’intera applicazione in pochi minuti. Tramite NetTiers Lo sviluppatore può decidere se avvalersi del solo supporto al DAL o se arrivare a farsi generare addirittura un’intera applicazione web, unitamente a i web services (WCF) correlati. L’integrazione con la libreria Enterprise Library assicura inoltre un robusto supporto per la creazione di regole di business.

Per partecipare all'evento è sufficiente registrarsi al seguente link: registrazione.

Tags: ,

XeDotNet | .NET

MSDN in low bandwidth

by andrea 20 April 2009 01:10

Leggo oggi dal post di Scott Hanselman 
(Low Bandwidth View and other Hidden (and Future) Features of MSDN) e scopro una funzionalità di MSDN davvero stupenda, e cioè la possibilità di visualizzare e navigare MSDN in formato "low bandwidth" (ed altre modalità).

La cosa che trovo stupeda è l'estrema velocità di caricamento che hanno le pagine, il che vuol velocizza anche il reperimento e la lettura. Ammentto che attendevo una funzionalità come questa da molto tempo, e sono convinto che molti di voi la penseranno allo stesso modo.

Per vedere a attivare questa visualizzazione, se la pagina che stiamo leggendo è
http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.aspx
inserendo "(loband)" nell'url
http://msdn.microsoft.com/en-us/library/system.xml.xmlnode(loband).aspx
verrà visualizzata la pagina nel nuovo formato.

MSDN MSDN_loband

MSDN_loband_2Per abilitare in modo permanente la funzionalità, all'interno della pagina in low bandwidth è possibile cliccare nel link "Persist low bandwidth", e successivamente, qualsiasi pagina/link aprirete verrà visualizzata in questa modalità.

Nel post sono elencate anche altre funzionalità introdotte in MSDN, tra le quali il miglioramento delle prestazioni ed altre nuove modalità di visualizzazione.

Complimenti davvero al team che ci stà lavorando, ed ora Persist low bandwidth attivato!!

Technorati Tags: ,

Tags: ,

.NET | Microsoft

Extension per BlogEngine - Meta Description

by andrea 15 April 2009 02:39

E' da parecchio tempo che seguo il progetto BlogEngine.NET e che ne faccio uso per questo blog. Con le prime versione, mi sono dovuto scrivere un bel pò di codice per adattarlo alle mie esigenze, e sopratutto per ottimizzarlo per l'indicizzazione nei motori di ricerca.
(SEO - Ottimizzazione per i motori di ricerca)
Ad ogni aggiornamento di BlogEngine.NET, mi accorgevo che il codice (scritto da me) che stavo riportando da una versione all'altra, si riduceva notevolmente. Fino a pochi giorni fa, che sono riuscito a inserire tutto il mio codice all'interno di una Extension, permettendomi d'ora in poi di agevolarmi nella procedura di aggiornamento (che ora si è ridotta ad un bel copia e incolla).

L'extension che ho creato permette di settare il tag meta-description della pagina con i primi 200 caratteri del post. Questo tag permette di specificare una descrizione per il contenuto della pagina migliorandone l'indicizzazione.

Creare l'Extension

Per fare questo, mi sono agganciato all'evento Serving del Post, ed al suo interno ho eliminato i tag html contenuti nel Body, e copiato i primi 200 caratteri all'interno della proprietà Description (che di default viene inserita nel tag meta description della pagina).

   1: /// <summary>
   2: /// Initializes the <see cref="MetaDescription"/> class.
   3: /// </summary>
   4: static MetaDescription()
   5: {
   6:     Post.Serving += new EventHandler<ServingEventArgs>(Post_Serving);
   7: }
   8:  
   9: /// <summary>
  10: /// Handles the Serving event of the Post control.
  11: /// </summary>
  12: /// <param name="sender">The source of the event.</param>
  13: /// <param name="e">The <see cref="BlogEngine.Core.ServingEventArgs"/> instance containing the event data.</param>
  14: static void Post_Serving(object sender, ServingEventArgs e)
  15: {
  16:     if (!string.IsNullOrEmpty(e.Body)
  17:         && string.IsNullOrEmpty(((Post)sender).Description)
  18:         && e.Location == ServingLocation.SinglePost)
  19:     {
  20:         // Remove the HTML tags
  21:         string content = ClearHTMLTags(HttpUtility.HtmlDecode(e.Body));            
  22:         
  23:         // Remove the encoded char. es: &#236; 
  24:         //content = ClearEncodedChar(HttpUtility.HtmlEncode(content));
  25:  
  26:         // Reduce the Length of text for meta description
  27:         if (content.Length > 200)
  28:             content = content.Substring(0, 200);
  29:  
  30:         // Set the description of post
  31:         ((Post)sender).Description = content;
  32:     }
  33: }

Rimuovere i tag HTML

Per elinare i tag HTML contenuti nel post ho utilizzato le Regular Expression, in quanto sono veramente performanti, e permettono agevolmente di eseguire ricerche e modifiche all'interno di testi scrivendo pochissime righe di codice:

   1: /// <summary>
   2: /// Clears the HTML tags.
   3: /// </summary>
   4: /// <param name="strHTML">The string with the tags to remove.</param>
   5: /// <returns></returns>
   6: private static string ClearHTMLTags(string strHTML)
   7: {
   8:     Regex regEx = null;
   9:     string strTagLess = string.Empty;
  10:     try
  11:     {
  12:         //this pattern mathces any html tag
  13:         regEx = new Regex("<[^>]*>", RegexOptions.IgnoreCase);
  14:         strTagLess = regEx.Replace(strHTML, "");
  15:         //matches a single <
  16:         regEx = new Regex("[<]", RegexOptions.IgnoreCase);
  17:         strTagLess = regEx.Replace(strTagLess, "&lt;");
  18:         //matches a single >
  19:         regEx = new Regex("[>]", RegexOptions.IgnoreCase);
  20:         strTagLess = regEx.Replace(strTagLess, "&gt;");
  21:  
  22:         return strTagLess;
  23:     }
  24:     catch
  25:     {
  26:         return strHTML;
  27:     }
  28: }

Rimuovere caratteri speciali

All'interno del codice del metodo Post_Serving, è presente una riga di codice commentata che punta a una funzione che permette (sempre tramita Regular Expression) di rimuovere i caratteri speciali/simboli presenti all'interno del post. Questo perchè vengono visualizzati con l'encoding e quindi il carattere "é" apparirebbe "&amp;#233;" (in quanto viene fatto un (doppio) encoding da BlogEnigne.NET). Questa informazione viene comunque interpretata correttamente dai motori di ricerca, e quindi ho preferito non rimuovere questi caratteri, ma per chi invece fosse interessato, è sufficiente che scommenti la linea.
Ecco qui la funzione che verrebbe eseguita:

   1: /// <summary>
   2: /// Clears the encoded char.
   3: /// </summary>
   4: /// <param name="strHTML">The string with encoded char to remove</param>
   5: /// <returns></returns>
   6: private static string ClearEncodedChar(string strHTML)
   7: {
   8:     Regex regEx = null;
   9:     string strEncodedCharLess = string.Empty;
  10:     try
  11:     {
  12:         regEx = new Regex(@"&(?ni:\#((x([\dA-F]){1,5})|(104857[0-5]|10485[0-6]\d|1048[0-4]\d\d|104[0-7]\d{3}|10[0-3]\d{4}|0?\d{1,6}))|([A-Za-z\d.]{2,31}));", RegexOptions.IgnoreCase);
  13:         strEncodedCharLess = regEx.Replace(strHTML, "");
  14:  
  15:         return strEncodedCharLess;
  16:     }
  17:     catch
  18:     {
  19:         return strHTML;
  20:     }
  21: }

Come utilizzare l'extension

Per utilizzare l'extension, non si deve fare altro che eseguire il download, e copiare il file contenuto all'interno della cartella \App_Code\Extensions del proprio blog.

Download file: http://files.dott.../BlogEngine-MetaDescription-01.zip

Tags: , ,

ASP .NET | .NET | Microsoft

Guida BlogEngine.NET

by andrea 14 April 2009 00:25

guida_BlogEngine Segnalo che sono usciti i primi articoli della "Guida BlogEngine.NET" che ho scritto per HTML.it.

BlogEngine.NET è una piattaforma di blogging, la stessa che utilizzo io per questo blog (blog.dottor.net), e viste le numerose domande che ho ricevuto a riguardo dell'installazione, customizzazione ed integrazione/espansione, ho colto al volo la possibilità di scrivere questa guida, che spero possa essere utili a molti di voi. (e pensare che all'inizio si trattava di un unico articolo...)

BlogEngine_logo Ho fatto il possibile per rendere la guida il più semplice possibile, in modo da poter aiutare chi è alle prime armi con .NET, ma non solo. Nella guida, infatti, sono trattati anche argomenti sul come customizzare BlogEngine.NET con la propria grafica e sul cosa si deve fare per espandere l'applicazione aggiungendo delle proprie funzionalità (extensios), che secondo me, sono le grandi potenzialità di questa piattaforma. (che usciranno prossimamente)

Il link alla guida è il seguente "Guida BlogEngine.NET", e per qualunque domanda/critica potete contattarmi senza problemi.

Technorati Tags:

Tags: ,

ASP .NET | .NET | Microsoft

Web Congress 2.0 - Ci vediamo tra poco

by andrea 27 March 2009 02:19

WebCongress2Slide preparate…
…e come al solito le ho terminate questa notte. Devo ancora capire perchè posso iniziarle anche un mese prima degli eventi, ma mi ritrovo a far modifiche fino all'ultimo momento. :D

Codice fatto…   
…di questo ne vado abbastanza fiero. Sono riuscito ad applicare i DynamicData ad un caso reale (aggiungendo un'area per gestire quest'applicazione), ma non voglio svelare troppo.

e quindi tutto è pronto…ci vediamo questo pomeriggio al Web Congress.

Technorati Tags: ,

Tags: , , ,

ASP .NET | .NET | XeDotNet

FileUpload caricato in un postback asincrono

by andrea 13 March 2009 01:54

Se avete provato a caricare un controllo FileUpload durante un PostBack asincrono, oppure settate la visibilità da false a true, avrete notato che il controllo non funziona correttamente e quindi non vi permette di caricare il file (anche se con PostBackTrigger impostato correttamente).

Questo problema avviene perchè il controllo non è in grado di aggiornare correttamente il tag form della pagina.

Per risolvere il problema si deve modificare il tag form aggiungendo l'enctype:

   1: enctype="multipart/form-data"

è anche possibile aggiungerlo da codice utilizzando questo codice nel page_load:

   1: Page.Form.Attributes.Add("enctype", "multipart/form-data"); 

 

Tags:

ASP.NET AJAX | ASP .NET | .NET

Aggiornare un UpdatePanel da un differente UserControl

by andrea 11 March 2009 06:54

Quando si utilizza un UpdatePanel consiglio sempre di impostare la proprietà UpdateMode a Conditional e ChildrenAsTriggers a False, per avere il pieno controllo su ciò che accade, e far trafficare il minimo html possibile.

Ci sono condizioni però in qui questo non sembra possibile.
Uno di questi casi è quando il postback asincrono dovrebbe essere scatenato da un controllo contenuto all'interno di un'altro UserControl. La soluzione più semplice sarebbe stata quella di settare UpdateMode ad Always, ma questo causerebbe l'aggiornamento durante un qualsiasi postback asincrono.
Ma anche a questo caso esiste una soluzione, e la soluzione sono gli eventi.

UserControl 1
Controllo che contiene il pulsante che deve scatenare il PostBack asincrono.

Questo UserControl esporrà un evento Command, che servirà come trigger per indicare che è stato scatenato un evento in un controllo in esso contenuto (in questo caso un LinkButton).
Andiamo a gestire l'evento OnCommand del LInkButton, e al suo interno faremo rilanciare l'evento utilizzando il metodo RaiseBubbleEvent.

Gli UserControl possono contenere controlli che scatenano eventi. Il metdo RaiseBubbleEvent permette di rilanciare all'esterno questi eventi, permettendo di riassegnare il sender.

Si ha quindi la condizione che l'evento OnCommand scatenato dal LinkButton verrà visto come evento OnCommand (contenente le stesse informazioni) ma generato dallo UserControl.

   1: public event CommandEventHandler Command;
   2:  
   3:  
   4: protected void Button_Command(object sender, CommandEventArgs e)
   5: {
   6:     CommandEventHandler handler = this.Command;
   7:  
   8:     if (handler != null)
   9:         handler(this, e);
  10:  
  11:     base.RaiseBubbleEvent(this, e);
  12: }

UserControl 2
Controllo che contiene l'UpdatePanel da aggiornare con il PostBack asincrono.

Il controllo contiene un UpdatePanel che deve essere aggiornato dal PostBack asincrono scatenato dal controllo contenuto nel primo UserControl.

Quello che si può fare è esporre la collection del Triggers dell'UpdatePanel, in modo da poterli impostare da chi utilizza il controllo.

Creiamo una proprietà Triggers (di tipo UpdatePanelTriggerCollection) nello UserControl e gli facciamo ritornare la collezione di trigger dell'UpdatePanel.
Per poterla vedere nel design, aggiungiamo gli attributi DesignerSerializationVisibility e PersistenceMode.

DesignerSerializationVisibility permette di specificare la visibilità della proprietà a design-time.

PersistenceMode specifica come la proprietà viene inserita nello UserControl, se tramite attributo o come proprietà interna.
Esempio di Attribute è la proprietà ID="…", o runat="sever" , che vendono specificate come attributi del tag.
Esempio di InnerProperty sono i SelectedParameters, o i Triggers, che devono essere specificati in un elemento contenuto nel tag del controllo, e non come attributi.

   1: [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
   2: [PersistenceMode(PersistenceMode.InnerProperty)]
   3: public UpdatePanelTriggerCollection Triggers
   4: {
   5:     get { return updPanel.Triggers; }
   6: }

La pagina

Inseriamo nella pagina i due UserControl. Come sarà possibile vedere, nel controllo DisplayData (UserControl 2) sarà visibile una proprietà Triggers che ci da la possibilità di inserire un trigger associato al controllo Filters (e che si aggancerà all'evento Command che noi abbiamo esposto).
In questo modo, al click del pulsante contenuto nel UserControl di ricerca, avremo l'aggiornamento asincrono dell'UpdatePanel contenuto nel UserControl DisplayData.

   1: <dtr:Filters ID="filters" runat="server" />
   2: <dtr:DisplayData ID="displayData" runat="server">
   3:   <Triggers>
   4:       <asp:AsyncPostBackTrigger ControlID="filters" EventName="Command" />
   5:   </Triggers>
   6: </dtr:DisplayData>

Ecco quindi che grazie alla possibilità di esporre (e gestire) gli eventi, abbiamo potuto mantenere l'UpdatePanel con UpdateMode a Conditional, permettendo quindi di non far scatenare postback asincroni del tutto inutili.

Tags: , , ,

ASP.NET AJAX | ASP .NET | .NET

MultiHandleSliderExtender in un Templated Control

by Andrea 05 March 2009 05:18

Se provate a utilizzare un MultiHandleSliderExtender all'interno di una GridView, o di un Repeater o di un altro Templated Control, vi capiterà con una bella eccezione javascript (null is null or not an object) in quanto non l'extender non riesce a trovare i controlli impostati come MultiHandleSliderTarget.
Dando un'occhiata al file javascript di questo extender si può notare che il controllo esegue la funzione $get (recupera un elemento all'interno della pagina) usando come parametro l'id inserito, ma che nel caso di inserimento in un Templated Control, questo sarà differente dall'effettivo id utilizzato nella pagina (ClientID), sollevando quindi l'eccezione.

Per risolvere questo è sufficiente gestire l'evento RowDataBound (nel caso della GridView) e sostituire in ogni MultiHandleSliderTarget l'id dei controlli con i rispetti ClientID.

Ecco il codice necessario:

   1: protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
   2: {
   3:     if (e.Row.RowType == DataControlRowType.DataRow)
   4:     {
   5:         MultiHandleSliderExtender slider = e.Row.FindControl("multiHandleSliderExtenderTwo") as MultiHandleSliderExtender;
   6:         foreach (MultiHandleSliderTarget target in slider.MultiHandleSliderTargets)
   7:             target.ControlID = e.Row.FindControl(target.ControlID).ClientID; 
   8:     }
   9: }

Tags: , , , ,

.NET | ASP .NET | ASP.NET AJAX

Preparare una presentazione tecnica

by andrea 27 November 2008 08:51

Segnalo 2 post di Scott Hanselman che danno delle ottime indicazione sul come preparare e come prapararsi per una sessione tecnica. Alcuni dei quali dovrebbero essere un must (per sessioni di un certo di livello).

Technorati Tags:

Tags:

.NET | Generale