Saturday, December 20, 2008

Doppio click con JQuery

. Saturday, December 20, 2008
0 commenti

In questi giorni sto eseguendo un pò di refactoring di codice javascript presente in un progetto Asp.Net 2.0, facendo uso delle API offerte dal framework JQuery.
Una delle primissime funzioni che ho sostituito completamente è stata quella in cui tramite l’evento doppio click su controlli di tipo Textbox si inseriva la data corrente.
L’Event Model di JQuery è estremamente versatile e ben strutturato oltre che semplice nell’utilizzo.
Se per esempio all’evento onclick di un button vogliamo far apparire un dialog box di alert senza far uso di un particolare framework javascript, dobbiamo scrivere qualcosa di questo tipo:

   1: <input type="button" id="btnTest" value="Click" onclick="javascript:alert( 'test click');" />

Utilizzando l’Event Model JQuery possiamo far uso del comando bind(). L’esempio precedente diventa:


   1: $('#btnTest').bind('click', function(event) { alert('test click'); });


La sintassi del comando bind:

   1: bind( eventType, data, function)

Ritornando alla funzione che accennavo ad inizio post, devo dire che l’utilizzo delle API JQuery mi ha permesso di ridurre sensibilmente il codice migliorando così anche la mantenibilità.

Nello specifico, supponendo di avere un controllo Textbox targato runat server:


   1: <asp:TextBox ID="txtDoubleClick" runat="server" Text=""></asp:TextBox>

Il codice per implementare un gestore di eventi per l’evento double click:

   1: <script type="text/javascript">
   1:  
   2: $(function() {
   3:   $('#txtDoubleClick').bind('dblclick', function(event) { setDateNow() })
   4: });
   5: function setDateNow() {
   6:   var date = new Date();
   7:   var day = date.getDate();
   8:   var month = date.getMonth() + 1;
   9:   var year = date.getFullYear();
  10:   $('#txtDoubleClick').val(day + "/" + month + "/" + year);
  11: }
</script>


E’ possibile passare diversi tipi di eventi:

blurfocusload
resizescrollunload
beforeunloadclickdblclick
mousedownmouseupmousemove
mouseovermouseoutmouseenter
mouseleavechangeselect
submitkeydownkeypress
keyuperror 


Se invece, volessimo ottenere lo stesso risultato per controlli Textbox presenti per esempio in un controllo GridView:

   1: <asp:GridView ID="dgrTest" runat="server">
   2:   <Columns>
   3:     <asp:TemplateField>
   4:       <ItemTemplate>
   5:         <asp:TextBox ID="txtDoubleClick" runat="server" Text=""></asp:TextBox>
   6:       </ItemTemplate>
   7:     </asp:TemplateField>
   8:   </Columns>
   9: </asp:GridView>

lo script potrebbe essere così modificato:


   1: <script type="text/javascript" src="jquery-1.2.6.min.js"></script>
   2: <script type="text/javascript">
   3:   $(function() {
   4:     $("#dgrTest input[type=text]").bind('dblclick', function(event) { setDateNow($(this)) })
   5:   });
   6:   function setDateNow(id) {
   7:     var date = new Date();
   8:     var day = date.getDate();
   9:     var month = date.getMonth() + 1;
  10:     var year = date.getFullYear();
  11:     id.val(day + "/" + month + "/" + year);}
  12: </script>

Essenzialmente la modifica più sostanziale riguarda il gestore dell’evento applicato a tutti i controlli input di tipo text presenti nella griglia con id dgrTest.
Concludo con un altro comando altrettanto importante one():


   1: one(eventType, data, function)

permette di rimuove l’handler dopo la prima esecuzione dell’evento specificato.

Read More »»

Sunday, December 14, 2008

Flex nel mondo .NET

. Sunday, December 14, 2008
0 commenti

L'innegabile crescente successo del framework open source Adobe Flex (per applicazioni RIA) ha portato, oltre al famoso Flex Builder, alla creazione di diversi ambienti utili allo sviluppo e al debugging.
Si pensi ad IntelliJ IDEA, un IDE Java, che recentemente ha aggiunto il supporto per Adobe Flex oppure alla recente partnership di Abobe con SAP.  SapphireSteel, che chi sviluppa in Ruby avrà sicuramente sentito nominare, ha presentato Ametista per lo sviluppo in Visual Studio usando Flex. Merita di essere segnalato anche un framework: WebORB in versione .NET per l'accesso ai dati da Flex/Flash.
Le feature sono diverse, si passa dal supporto per Silverlight, ai template per Visual Studio, supporto per MSMQ queue ecc.
Questa soluzione si affianca ad un altro framework: FluorineFx che implementa Flex/Flash Remoting, Flex Data Services sempre per il .NET Framework.

Ovviamente dal canto mio trovo più interessante osservare alcuni casi che riguardano più da vicino .NET. Nonostante non abbia mai scritto una riga di codice con le API di Flex, ho voluto provare a togliermi la curiosità di sapere se per noi sviluppatori .NET la scelta di Silverlight sia proprio scontata, quindi per eseguire qualche esperimento ho utilizzato Tofino, plugin per Visual Studio 2008 presentato da Ensemble.

Il setup del plugin pesa all'incira 83 MB e per funzionare necessita che Java sia installato. Tramite i template aggiunti possiamo creare facilmente un progetto Flex:

Tofino1 
Ed è qui che sono iniziati i "problemi".

Pur trattandosi di una plugin in beta, trovarsi senza supporto per l'intellisense per i file MXML o per l'ActionScript è stato un pò "sconfortante". Per il momento non è previsto neanche un editor visuale per MXML.  Con questo non voglio assolutamente sminuire il lavoro svolto, anzi sono certo che continuerò con interesse a seguire l'evolversi non solo di questo plugin ma di tutti gli esempi di integrazione del mondo Flash nel mondo .NET ma, trovo che per il momento, sviluppare tramite il framework Flex in ambiente .NET non sia praticabile o per meglio dire la strada da percorrere è sicuramente più in salita rispetto ad uno che si avvicina per la prima volta a Silverlight.

Read More »»

Saturday, December 13, 2008

Invocare Web Service da Workflow

. Saturday, December 13, 2008
0 commenti

Invocare un web service da un workflow è un'operazione abbastanza semplice, basta far uso dell'activity InvokeWebServiceActivity.
Ma vediamo più nel dettaglio quali passi sono necessari per raggiungere lo scopo.
Per usare l'InvokeWebServiceActivity bisogna aggiungere un web reference al progetto che contiene il nostro workflow:
WebServiceWF1
WebServiceWF2
Tramite il property ProxyClass dell'activity andiamo ad indicare il nome della proxy class attraverso cui possiamo invocare il web service. 
Mentre con il property MethodName indichiamo il nome del metodo sul web service che vogliamo invocare.
Supponendo di avere il seguente web service con il classico metodo HelloWorld:

   1: public class Service : System.Web.Services.WebService
   2: {
   3:   public Service () {
   4:       //Uncomment the following line if using designed components 
   5:       //InitializeComponent(); 
   6:   }
   7:  
   8:   [WebMethod]
   9:   public string HelloWorld() {
  10:       return "Hello World1";
  11:   }  
  12: }


l'activity InvokeWebServiceActivity sarà così impostato:

WebServiceWF3 
Il valore di ritorno del metodo HelloWorld, come si può notare dall'immagine, è bindato al dependency property MyReturnValue.
A questo punto dell'opera può, però, sorgere un dubbio.
Ma se si vuole modificare l'url usato per invocare il web service?
In tal caso a seconda di come è stato strutturato il progetto si può agire in maniera diversa ma in linea di massima si può intervenire nell'evento Invoking dell'activity.
Questo evento scatta prima che il web service sia chiamato.
Così facendo possiamo modificare a runtime il property Url:


   1: private void invokeWebServiceActivity1_Invoking(object sender, 
InvokeWebServiceEventArgs e)
   2: {
   3:   WSTest.Service serProxy = (WSTest.Service)e.WebServiceProxy;
   4:   serProxy.Url = "http://localhost/WSTest2/Service.asmx";
   5: }

Ma per rendere dinamico il property Url l'approcio migliore è quello di creare una chiave, nel web.config in caso di applicazione web Asp.Net o app.config in caso di applicazione windows (nel caso specifico l'applicazione che fa da host del runtime è una web application):


   1: <appSettings>
   2:   <add key="WSTestUrl" value="http://localhost/WSTest2/Service.asmx"></add>
   3: </appSettings>


Con questo altro tassello, il codice precedente può diventare:

   1: private void invokeWebServiceActivity1_Invoking(object sender, 
   2:             InvokeWebServiceEventArgs e)
   3: {
   4:   WSTest.Service serProxy = (WSTest.Service)e.WebServiceProxy;
   5:   serProxy.Url = ConfigurationSettings.AppSettings["WSTestUrl"].ToString();
   6: }

Read More »»

Tuesday, December 9, 2008

Link .Net #10

. Tuesday, December 9, 2008
0 commenti

Anche se con qualche giorno di ritardo ecco il decimo appuntamento con Link .Net:

Making Asynchronous Calls to WCF Services from ASP.NET
Nell'articolo viene spiegato come creare un servizio WCF e consumarlo in modo asincrono utilizzando una web application Asp.Net. en

ASP.NET Writing to the Event Log
Un semplice tip su come scrivere nei log eventi di Windows tramite la classe EventLog. en

Unit testing in Silverlight
Come implementare unit testing in Silverlight:
parte 1
parte 2
en

5 ways to import data
Cinque modi per importare contatti (clienti, prodotti ecc) in Microsoft Dynamics CRM 3.0. en

Read More »»

Saturday, December 6, 2008

Silverlight con Eclipse

. Saturday, December 6, 2008
0 commenti

Silverlight è un plugin compatibile con i più diffusi web browser sia per ambiente Windows sia per Mac, che consente di sviluppare applicazioni RIA.
Gli strumenti di lavoro sono ovviamente Visual Studio 2008 e Visual Web Developer 2008 Express o Microsoft Expression Blend 2.
Alla lista si aggiunge un altro ambiente, questa volta open source eclipse4SL che consente di utilizzare Eclipse nella costruzione di applicazioni Silverlight.
Tutto questo grazie anche al supporto di Microsoft a Soyatec permettendo così di aggiungere un altro tassello sul fronte dell’interoperabilità.
Le feature che questa versione include:

  • Project resource management in Eclipse IDE
  • XAML Editor & Preview
  • C# code editor with syntax colorization, keywords and template code completion assist
  • Automatic Build & Run
  • Configurable Web application launch facilities
  • Developer Usability Testing
    SilverEclipse SilverEclipse2

Read More »»