Codice e slide della sessione Sviluppare con ASP.NET 4.0

by Andrea 10 December 2009 04:01

ASPNET_logo Ecco disponibile per il download il zip contenente codice e slide della mia sessione "Sviluppare con ASP.NET" tenuta al Community Tour 2009 a San Vito al Tagliamento il 4 dicembre 2009.

Ecco il link per il download.

Con le varie versioni del Microsoft .NET Framework, anche ASP.NET si è evoluto, e racchiude già un gran numero di funzionalità e tecnologie che coprono lo sviluppo in ambito web.In questa sessione capiremo i vantaggi che la prossima versione del Framewrok porterà con ASP.NET 4.0. La sessione non sarà solamente una carellata di nuove funzionalità, ma bensì sarà focalizzata su come la prossima release potrà aiutare lo sviluppatore nella realizzazione delle proprie applicazioni.

Le nuove funzionalità presenti in ASP.NET 4.0 le trovate elencate a questo link
ASP.NET 4 and Visual Studio 2010 Web Development Beta 2 Overview

Per qualsiasi domanda a riguardo, non esitate a contattarmi.

Tags: , , ,

XeDotNet | .NET | ASP .NET | Microsoft

il lato (o)scuro di Visual Studio

by Andrea 18 November 2009 03:18

Ho letto (e visto) vari post di persone che utilizzano Visual Studio con lo sfondo nero/scuro al posto del tema classico (che ha lo sfondo bianco).

Dopo uno dei meeting di XeDotNet era nata una chiaccherata in merito, e ne è uscito che chi ha iniziato ad utilizzare lo sfondo scuro, dopo un breve periodo per abituarsi, ne ha tratto benefici, in quanto lo sfondo nero affatica meno la vista (e viste le ore che passiamo davanti al pc, la cosa non è affatto indifferente).

Più volte avevo provato questo passaggio, ma mi sono sempre scontrato con dei temi/settings che non mi davano un feedback al pari di quello di default. Alcuni hanno troppo contrasto tra i vari colori, altri invece troppo poco…e alla fine il codice non risultava comprensibile a colpo d'occhio, e a volte risultava addirittura fastidiosa.

Moria_Alternate Ho chiesto a Davide Senatore quale utilizzasse (visto che si trova bene, e che lo utilizza da parecchio tempo), e dopo una settimana d'uso (sia a casa che a lavoro) devo dargli ragione.

Il tema in questione è il Moria Alternate, che vedete nell'immagine qui accanto. Il suo vantaggio è di utilizzare come sfondo un colore che si avvicina al nero (ma che non è nero), e fare uso di colori che non sono troppo accesi, ma che hanno il giusto contrasto.
Al momento non ho avuto necessità di dover cambiare nulla, se non la dimensione del font, che da 14 ho portato a 11, ma questo ovviamente dipende anche dal monitor che utilizzate.

UPDATE: i settings che stò utilizzando sono il Moria Alternate che trovate a questo link VS2008 Color Schemes, che differisce per alcuni colori (sebbene abbia le stesse tonalità), più verso il celeste, rispetto al rosso utilizzato nella versione originale.

Dopo una settimana posso dire che mi trovo davvero bene...ho raggiunto lo stessa leggibilità dei settings di default, che ritengo sia la cosa più importante. Ma non sono in gradi di dire se la mia vista si affatichi di meno, ma a rigor di logica, guardando uno schermo meno illuminato dal bianco, questo dovrebbe essere vero.

Per chi fosse interessato a trovare/provare il lato (o)scuro di Visual Studio, vi rimando ad un interessante post di Scott Hanselman dove elenca (e linka) molti di questi temi:
Visual Studio Programmer Themes Gallery

Rob Conery - Textmate Ragnarok John Lam's Vibrant Ink Port

Technorati Tags: ,,

Tags:

.NET | Microsoft

Visual Studio 2010 "The application cannot start"

by Andrea 17 November 2009 12:52

Se con la beta 2 di Visual Studio 2010 vi si presenta l'errore "The application cannot start", sappiate che esiste una soluzione, senza dover reinstallare tutto, e la potete trovare in questo post: How to Fix “The application cannot start” Error

L'errore vi si presenta con questa schermata:
Visual Studio 2010 beta 2

Devo ammettere che ho avuto 5 minuti di terrore, in quanto in questo periodo stò utilizzando Visual Studio 2010 per preparare 2 meeting che dovrò tenere a dicembre, e appena visto l'errore ho subito pensato di dover perdere tempo a formattare e reinstallare completamente la macchina...ma per fortuna non è stato così.

Lanciando Visual Studio 2010 dal prompt digitando devenv /resetuserdata si è sistemato tutto.

Technorati Tags:

Tags: ,

.NET | Microsoft

Esempi di Windows Workflow Foundation

by Andrea 06 October 2009 08:34

TutorialsCercando di capire come creare il mio primo workflow di tipo State Machine, che cambi lo stato grazie ad eventi esterni, decido di cercare degli esempi per avere qualche indicazione, ed incappo in alcuni tutorial che sono del tutto incomprensibili.
Tutorial scaricabili direttamente da qui,
Create a State Machine Workflow.

Mi piacerebbe proprio capire chi è in grado di comprendere cosa è contenuto in quel file, visto che i nomi delle cartelle sono Tutorial1, Tutorial2, Tutorial3, Tutorial4 e Tutorial5, che a sua volta contengono delle cartelle Exercise1, Exercise2 e Exercise3, e che a loro volta contengono dei file zip chiamati Task1.zip, Task2.zip e Task3.zip.
Dopo un pò di soluzione aperte a casaccio (perchè nell'articolo non viene indicato il corrispondente tutorial/exrcise/task)  mi decido a chiudere tutto e a cercare di meglio.

Ecco infatti, che sempre dal sito di MSDN ho trovato questi esempi  scaricabili da questa pagina Ordering State Machine Sampleche invece sono veramente ben fatti, e completi.
Gli esempi non comprendono solo State Machine, ma sono esempi che coprono parecchie altre funzionalità di Workflow Foundation, WCF e CardSpace.
Davvero ottimi. ;-)

Tags:

.NET | Microsoft

Windows Workflow Foundation - abilitare il tracking

by Andrea 06 October 2009 05:44

Come per il servizio di persistenza (descritto nel precedente post), Windows Forkflow Foundation dispone di un provider di default anche per tracking, che si chiama SqlTrackingService.

Questo servizio si occupa di tenere traccia di tutti i cambiamenti che avvengono all'interno di un workflow, da quando viene instanziato a quando viene concluso, memorizzando anche tutte le informazioni che hanno portato ai vari cambiamenti di stato.
Per maggio info: Windows Workflow Tracking Services

Anche per questo provider è necessario predisporre il database per l'utilizzo. Si dovrà creare il database che dovrà contenere le informazioni (CREATE DATABASE WorkflowTrackingStore) e successivamente lanciare gli script
SqlTracking_Schema.sql e SqlTracking_Logic.sql
che si trovano in
C:\Windows\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\en.

Il codice di utilizzo è identico a simile a quello del servizio di persistenza. Ecco il codice, integrato all'esempio precedente:

   1: // Create the runtime and services objects.
   2: WorkflowRuntime runtime = new WorkflowRuntime();
   3: SqlWorkflowPersistenceService persistenceService = new SqlWorkflowPersistenceService("connectioString");
   4: SqlTrackingService trackingService = new SqlTrackingService("connectioString");
   5:  
   6: // Add the services and start the runtime.
   7: runtime.AddService(persistenceService);
   8: runtime.AddService(trackingService);
   9: runtime.StartRuntime();
  10:  
  11: // Stop the runtime and remove the services.
  12: runtime.StopRuntime();
  13: runtime.RemoveService(persistenceService);
  14: runtime.RemoveService(trackingService);

Per maggiori informazioni a riguardo di come preparare l'applicazione all'uso del servizio di tracking, ecco qui il link alla pagina su MSDN: Using

Nei prossimi post vedremo meglio in dettaglio l'utilizzo di questi servizi e la loro effettiva utilità.

Tags:

.NET | Microsoft

Windows Workflow Foundation - abilitare la persistenza

by Andrea 06 October 2009 05:10

In rete si trova parecchia documentazione riguardante Windows Workflow Foundation, ma spesso nei vari esempi o articoli non viene descritta una parte fondamentale, come nel caso della persistenza, ho dovuto sfogliare parecchi link prima di trovare il come creare il database per poter utilizzare il provider SqlWorkflowPersistenceService.

Questo provider è il provider che viene fornito di default per persistere un workflow in un database SQL Server. (E' comunque possibile creare un provider custom seguendo le indicazioni che trovate a questo link)
Mantenere un workflow solo in memoria ha parecchie limitazioni, e nel caso di operazioni lunghe, o crash/recycle del processo, questo potrebbe essere un problema non da poco. Ecco che il servizio di persistenza permette di ovviare a questi problemi, mantenendo persistente lo stato, e quindi permettendo il recupero del workflow.
Il runtine del workflow, nel caso abbia un sevizio di persisteza presente, si occupa di salvare in automatico (o volendo anche in modo manuale) il proprio stato, in particolari condizioni:

  • alla fine di una transazione atomica
  • sull'evento di Idle entrando in una Delay Activity
  • quando l'host chiama WorkflowInstance.Unload sull'istanza del flusso di lavoro
  • quando un'istanza del flusso di lavoro viene terminata o si conclude

Ovviamente è in grado di ripristinare il proprio stato in modo automatico, o volendo anche di forzarlo in manuale.

Prima di procedere a scrivere del codice si dovrà predisporre il database all'uso di questo servizio.
Sarà necessario quindi creare un database vuoto (CREATE DATABASE WorkflowPersistenceStore)
e poi lanciare gli script
SqlPersistenceService_Logic.sql e SqlPersistenceService_Schema.sql
che si trovano in
C:\Windows\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\en (ovviamente all'interno del database appena creato).

Nell'applicazione, una volta referenziati gli assembly di Windows Workflow Foundation, si potrà aggiungere il servizio da codice nel seguente modo:

   1: // Create the runtime and SqlWorkflowPersistenceService objects.
   2: WorkflowRuntime runtime = new WorkflowRuntime();
   3: SqlWorkflowPersistenceService persistenceService = new SqlWorkflowPersistenceService("connectioString");
   4:  
   5: // Add the SqlWorkflowPersistenceService and start the runtime.
   6: runtime.AddService(persistenceService);
   7: runtime.StartRuntime();
   8:  
   9: ...
  10: // Stop the runtime and remove the SqlWorkflowPersistenceService.
  11: runtime.StopRuntime();
  12: runtime.RemoveService(persistenceService);

Per maggiori informazioni a riguardo di come preparare l'applicazione all'uso del servizio di persistenza, ecco qui il link alla pagina su MSDN: Using SqlWorkflowPersistenceService

Tags:

.NET | Microsoft

Windows Workflow Foundation…da dove partire

by Andrea 06 October 2009 05:02

Dopo parecchio tempo dalla sua uscita, finalmente è capitata l'occasione di potermi studiare (e forse applicare) Windows Forkflow Foundation.

Per chi non lo conoscesse, si tratta di un framework e un engine che permettono di gestire dei processi secondo un preciso flusso. Esistono diverse tipologie di workflow che rispondono a differenti esigenze: nella versione attuale si ha la possibilità di scelta tra sequential workflow e state machine, ma quest'ultimo, nella prossima versione del framework, verrà sostituito dal flow chart).

Windows Workflow Foundation...
provides a programming model, in-process workflow engine and rehostable designer to implement long-running processes as workflows within .NET applications.

Per chi deve iniziare a studiarsi questa tecnologia, i punti di partenza sono i seguenti link:
MSDN Library: Windows Workflow Foundation
.NET Framework Developer Center: Windows Workflow Foundation

Suggerisco anche di scaricare le slide e il codice dell'evento che Raffaele Rialdi ha tenuto a XeDotNet, e che trovate a questo link:
Community Meeting: Workflow Foundation - 11 Maggio 2007

Un ulteriore consiglio a chi stà iniziando ora (come nel mio caso) a conoscere questa tecnlogia, è quello di documentarsi a riguardo delle novità/cambiamenti che verranno introdotti nella prossima versione del Framework, in modo da predisporre l'applicazione per eventuali cambiamenti/migliorie ed evitare quindi di buttare all'aria codice appena prodotto.
Upcoming Changes to .NET Framework 4: Windows Workflow Foundation (WF)

Tags:

.NET | Microsoft

Microsoft MVP ASP.NET…rinnovato!!

by Andrea 01 October 2009 07:51

MVP_logo

Da pochi minuti ho ricevuto la conferma del mio rinnovo come Microsoft MVP ASP.NET.

E' il mio secondo award, e quindi il mio primo rinnovo…ma ho vissuto la giornata esattamente come un anno fa…in trepidante attesa di quella mail, che poteva anche non arrivare mai. E credetemi che è un'attesa infinita.

MVP Open Days 2009Sono veramente felice di essere stato rinnovato, perchè in quest'ultimo anno ho avuto modo di crescere ulteriormente grazie anche a questo premio e alle persone che il programma MVP riesce ad unire.

Un grazie sincero a tutte le persone che mi fanno capire quanto sono appassionato a questo mondo...da chi incontro agli eventi di XeDotNet, a chi scrive nei forum e nei newsgoup…in modi differenti, ma avete sempre stimolato la mia voglia di crescere e di diffondere quel poco che so. ;-)

Ma il più importante ringraziamento (doveroso) va a Maria Elena (la mia fidanzata), per la pazienza che ha nei miei confronti nel permettermi di seguire le mie innumerevoli attività ed impegni.

Grazie!!

Tags: , ,

Microsoft | +1 | .NET | ASP .NET

DynamicData e ColorPicker FieldTemplates

by Andrea 16 September 2009 03:17

Con i Dynamic Data la velocità di realizzare l'applicazione aumenta notevolmente (ovvio che dipende sempre dal tipo di applicazione che si deve realizzare) e con la creazione di FieldTemplates di ha la possibilità di migliorare l'iterazione tra applicazione e utente.

Una delle necessità che ho avuto è stata quella di dover far inserire il valore in esadecimale di un colore (es: #FFFFFF), e consapevole del fatto che un utente non potesse conoscere i valori a memoria, mi sono adoperato per realizzare un opportuno FieldTemplate.
L'ultima versione degli AJAX Control Toolkit mi è venuta in aiuto grazie al controllo ColorPicker che è stato recentemente incluso, ed ecco qui il risultato ottenuto:

ColorFieldTemplate

Il codice del FieldTemplate è il seguente:

   1: public partial class Color_EditField : FieldTemplateUserControl
   2: {
   3:     protected override void ExtractValues(IOrderedDictionary dictionary)
   4:     {
   5:         dictionary[Column.Name] = ConvertEditedValue(txtColor.Text);
   6:     }
   7:  
   8:     public override Control DataControl
   9:     {
  10:         get { return txtColor; }
  11:     }
  12: }
   1: <%@ Control Language="C#" CodeBehind="Color_Edit.ascx.cs" Inherits="DynamicData.FieldTemplates.Color_EditField" AutoEventWireup="True" %>
   2:  
   3: <asp:ImageButton 
   4:     runat="Server" 
   5:     ID="btnOpenColorPicker" 
   6:     style="float:left;margin:0 3px" 
   7:     ValidationGroup="none" 
   8:     ImageUrl="~/images/cp_button.png" 
   9:     AlternateText="Click to show color picker" />
  10: <asp:Panel 
  11:     runat="server"
  12:     ID="pnlColor" 
  13:     style="width:18px;height:18px;border:1px solid #000;margin:0 3px;float:left" />
  14: <atk:ColorPickerExtender 
  15:     runat="server"
  16:     ID="colorPicker"     
  17:     TargetControlID="txtColor" 
  18:     PopupButtonID="btnOpenColorPicker" 
  19:     SampleControlID="pnlColor" 
  20:     PopupPosition="Absolute" />
  21: <asp:TextBox ID="txtColor" 
  22:     runat="server" 
  23:     Text='<%# FieldValueEditString %>' 
  24:     style="visibility:hidden;" />

Nella mia applicazione non avevo la necessita di visualizzare il codice del colore (che compare nella TextBox), ma nel caso a qualcuno interessasse, sarà sufficiente togliere lo stile "visibility:hidden;" dalla TextBox txtColor.

Tags: ,

ASP.NET AJAX | ASP .NET | .NET

ASP.NET Ajax Control Toolkit e DynamicPopulateExtenderControlBase

by Andrea 14 September 2009 06:51

Stavo introducendo il controllo HoverMenuExtender all'interno di uno UserControl e nell'intellisense mi compaiono alcune proprietà che mi risultano "anomale" per il controllo che stavo per utilizzare. Anomale nel senso che non mi aspettavo proprio di trovare tali proprietà in questo controllo.
HoverMenuExtender 
Le proprietà in questione sono quelle che hanno il suffisso Dynamic: DynamicContextKey, DynamicControlID, DynamicServiceMethod e DynamicServicePath.

Visto che (dal nome) potevano fare al caso mio, guardo la documentazione online, e scopro che non esiste documentazione a riguardo. Allora, come spesso accade, scarico i sorgenti degli ajax control toolkit e do un'occhiata al codice per capire dove fossere utilizzate e a cosa servissero. Ed è qui che sono rimasto sorpreso.

I controlli HoverMenuExtender, DropDownExtender, ModalPopupExtender e PopupControlExtender derivano dalla classe base DynamicPopulateExtenderControlBase, che contiene per l'appunto queste proprietà:

  • DynamicServicePath: url del web service che conterrà il metodo da chiamare. (lasciare vuoto se si intende chiamare un page method)
  • DynamicServiceMethod: metodo del web service da chiamare.
  • DynamicContextKey: permette di definire un parametro opzionale per parametrizzare il metodo chiamato. (parametro opzionale)
  • DynamicControlID: id del controllo che verrà utilizzato come container per iniettare il codice HTML restituito dal metodo.

Utilizzando queste proprietà è possibile utilizzare un metodo (DynamicServiceMethod) di un web service (DynamicServicePath) per farsi ritornare una porzione di condice HTML, che verrà poi iniettato in un preciso controllo (DynamicControlID).

Per provare se il tutto funziona correttamente, la via più semplice è quella di provare il tutto.
Creo un metodo in un web service che restituisca una porzione di codice HTML:

   1: [WebMethod]
   2: [ScriptMethod]
   3: public string GetHoverMenuContent(string contextKey)
   4: {
   5:     return String.Format("<span style='{0}'>Hello World!</span>", contextKey);
   6: }

e nella pagina vado a inserire il controllo, con le proprietà correttamente valorizzate:

   1: <ajax:HoverMenuExtender 
   2:     ID="hoverMenuExtender"
   3:     runat="server"
   4:     TargetControlID="linkButton" 
   5:     PopupControlID="Panel1" 
   6:     PopupPosition="Right" 
   7:     DynamicControlID="Panel2"
   8:     DynamicContextKey='font-weight:bold' 
   9:     DynamicServiceMethod="GetHoverMenuContent" 
  10:     DynamicServicePath="~/ajax.asmx" />
  11:  
  12: <asp:Panel ID="Panel1" runat="server" style="display:none;">
  13:   <asp:Label ID="Panel2" runat="server" />
  14: </asp:Panel> 

Il risultato che ho ottenuto è stato esattamente quello voluto, e quindi che al passaggio del mouse sopra al linkButton (o al controllo definito nella proprietà TargetControlID), è stato chiamato il metodo del web service, passando nel parametro contextKey il valore specificato nella prorietà DynamicContextKey (in questo caso il valore è fisso a font-weight:bold), e una volta ritornato il codice HTML, questo è stato inserito come innerHTML del controllo Panel2, e il Panel1 reso visibile.

In poche parole, tramite queste proprietà si ha la possibilità di popolare i controlli con maggiore dinamicità, e delegando la creazione di parte del contenuto HTML ad un metodo esterno. Questo in molti casi risulta veramente utile, permettondo con poche righe di codice di ottenere il comportamento/effetto voluto, e dimostrando per l'ennesima volta la flessibilità dei controlli contenuti negli AJAX Control Toolkit.

Tags: ,

ASP.NET AJAX | ASP .NET | .NET