web 2.0

SharePoint 2010, novità per gli sviluppatori

Ovviamente tutti sanno che da questa versione SP ha finalmente una stretta integrazione con VisualStudio 2010.
Finalmente perché chi ha sviluppato anche solo una webpart sa cosa vuol dire aver a che fare con SP 2007.

Ma questa non è l’unica novità.

Le novità più importanti per noi sviluppatori riguardano diversi fronti, dalle liste, all’integrazione di dati esterni a SP, ai tool di sviluppo come accennato prima.

Quello che mi ha reso veramente felice è la possibilità di scrivere le query che prima dovevamo scrivere in CAML (usate tramite l‘OM), direttamente in Linq2SP.
Integrato in modo nativo in SP 2010, Linq2SP permette di creare il DataContext tramite un tool (spmetal.exe) e poi su questo effettuare query linq come abbiamo sempre fatto per esempio in LinqToEntities. Quindi finalmente scriviamo anche qui query tipizzate, sfruttando join, projection, ecc. ecc.

L'introduzione del Client Object Model permette di scrivere applicazioni che utilizzano un sotto insime dell’OM di SP ma che non devono più per forza di cose risiedere sul server. Prima uno dei modi era quello di utilizzare i webservice che SP offre, adesso possiamo mantenere la coerenza di sviluppo utilizzando un OM praticamente simile a quello lato server (è pur sempre un sotto insieme).
Quello che è veramente cool è che possiamo usare il Cliente OM in applicazioni .NET (console, winform, WPF, ecc.), in Silverlight e soprattutto in JavaScript.
Questo permette di poter scrivere una serie di operazioni che prima richiedevano magari dei postback lato server in modo da migliorare la user experience e aumentare le performance (meno postback si fanno, meglio è).
Ricordiamo che SP 2010 presenta un’interfaccia utente completamente riscritta.
La presenza dei Ribbon e del suo modello di estendibilità, fanno capire che l’utilizzo di JavaScript sarà sempre più “indispensabile”.
Creare custom action che si basano su postback, vuol dire buttare all’aria tutto il framework e il “modello di utilizzo” che Microsoft con SP 2010 vuole (giustamente) imporre con questa nuova versione. Quindi morale della favola: Client Object Model a go go!!!! ;-)

La parte di accesso a dati esterni è stata migliorata e non di poco. I “Businnes Connectivity Services” permettono di poter accedere non solo in lettura ma anche in inserimento, cancellazione e modifica, a fonti dati di tipo relazionali, web service, classi .NET e a Connector custom sviluppati proprio con Visual Studio 2010. Quindi un modello estendibile che virtualmete permette di interfacciare qualsiasi tipo di fonte dati. Questi dati vengono gestiti con nuovi “type” chiamati External Content Type, che vengono visti dal sistema come dei normali content type. Quindi possibilità di gestire lookup su queste liste (External List) e via dicendo. Inoltre i BCS vengono anche utilizzati per l’accesso ai dati in modo disconnesso tramite SharePoint Workspace 2010 (ex Groove) e Outlook 2010. Tutto questo ben di dio è presente dalla versione “SharePoint Foundation” :-D

Per quanto riguarda le liste le migliorie più importanti possono essere riassunte nella gestione di costraint simili a quelle di un db relazionale per i campi di lookup, nella definizione di colonne che siano “unique” e nella validazioni dei campi prima di effettuare inserimenti o modifiche, anche con formule custom. Finalmente quindi, possiamo mantenere la coerenza dei dati in modo “out of the box” senza ricorrere a barba trucchi o a codice custom.

Inoltre, oltra all’integrazione con Visual Studio 2010, adesso SharePoint Designer 2010 può essere utilizzato come vero e proprio tool di sviluppo.
Questo perché SP permette di salvare i “template” e successivamente importali in Visual Studio 2010 per andare a creare le feature e estendere le customizzazioni che abbiamo fatto utilizzando un tool molto più semplice di Visual Studio.

Le novità non finiscono qua, queste sono solo alcune delle cose che ho voluto sottolineare perché rappresentano veramente un passo avanti notevole.

Vorrei aggiungere come poi, grazie appunto all’integrazione con Visual Studio 2010, le difficoltà nel sviluppare in SharePoint 2010 si siano notevolmente abbassate. Ovviamente non voglio dire che adesso chiunque può sviluppare su SharePoint 2010 senza neanche conoscerlo, ma intendo dire che la curva di apprendimento si è abbassata. Adesso a uno sviluppatore ASP.NET risulta più famigliare sviluppare estensioni per SP 2010 rispetto a quello che poteva essere sviluppare in SP 2007.

Nei prossimi post parlerò in modo più approfondito di tutte queste cose.

Correntemente valutato 5.0 da 1 utenti

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

SharePoint 2010

Get Started Developing on SharePoint 2010

Ecco una serie di link con materiale utile per cominciare a familiarizzare con la programmazione in SharePoint 2010.

Buona lettura/visione.

Vota questo post per primo

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

SharePoint 2010

[OT] Impegni e Blog

E' molto tempo che non scrivo nessun tipo di post.
Purtroppo negli ultimi mesi, gli impegni mi hanno portato a trascurare il blog, ma c'è sempre tempo per recuperare ;-)
In questi mesi, sono stato in giro per il mondo: Prima a Amsterdam a ottobre per seguire il corso "Ignite" su SharePoint 2010, poi a Los Angeles in novembre per partecipare al mio primo PDC.
Ultimamente il mio target principale sta diventando SharePoint e più precisamene la versione 2010 di cui a breve comincerò a postare qualcosa.
Quindi aspettatevi a breve post su questo fantastico prodotto.

Vota questo post per primo

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Public Folders replacement in SharePoint 2007

Come tutti sanno, è possibile utilizzare Outlook come interfaccia verso SharePoint 2007 e quindi gestire le Liste e le Document Library direttamente da Outlook.

La prima volta che si connette una Lista o una Document Library di SharePoint a Outlook, viene creato un file PST nel profilo di Outlook e per ogni Library o Lista, viene creata una cartella in questo PST.

In Outlook 2003 il file viene chiamato "SharePoint Folders.pst" mentre in Outlook 2007 "SharePoint Lists.pst".
Utilizzando "Invia/Ricevi" si riesce a sincronizzare il contenuto fra SharePoint e Outlook.
In Outlook 2003 la sincronizzazione è monodirezionale da SharePoint a Outlook, mentre in Outlook 2007 la sincronizzazione è bidirezionale per: Liste, Contatti, Calendari e Discussioni e monodirezionale per le Document Library.

E' comunque possibile modificare i documenti in modalità non in linea con Outlook 2007 e effettuare la sincronizzazione manuale dei documenti salvati nella raccolta di documenti locali.

Ovviamente, andando a utilizzare SharePoint come sostituto delle Public Folders, i vantaggi sono innumerevoli.

Primo fra tutti è il supporto al cestino: qualsiasi elemento eliminato viene spostato nel cestino prima locale al sito e poi globale.

Inoltre, è possibile applicare protezioni basate su ruoli a livello di singolo elemento, cosa che non si poteva fare prima.

Esistono dei tools che riescono a migrare le Public Folders, ma è da verificare e testare cosa riescono a fare.

Rimando a questo post che contiene anche una serie di link utili.

Correntemente valutato 5.0 da 1 utenti

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , ,

SharePoint 2007 | MOSS 2007 | WSS 3

ASP.NET 2.0 e Default Button

Post veloce (ultimamente ho poco tempo :-( ) per dimostrare come non si finisce mai di imparare nel nostro lavoro.

Mi sono appena imbattuto nel classico problema di rendere un bottone quello di default all'interno di un form asp.net e ho scoperto che basta settare la proprietà "defaultbutton" proprio del form con l'id del bottone che vogliamo rendere appunto quello di default.

Cosi facendo, anche se premiamo Enter sulla tastiera, verrà generato il postback associato al bottone che abbiamo reso di default.

Ottimo direi!!

Vota questo post per primo

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

ASP.NET

Liste di SharePoint 2007 o Tabelle su DB?

Sviluppando un’applicazione per utilizzo personale in SharePoint 2007 ho toccato con mano la problematica di decidere se utilizzare tabelle su DB o utilizzare le liste di SharePoint 2007.
Le liste possono essere equiparate a un’ insieme di righe e colonne, proprio come le tabelle di un DB relazionale.

Il vantaggio principale delle liste è quello di avere un modo semplice per gestire i dati.
Grazie alle viste e alle web part, è virtualmente possibile creare l’interfaccia di amministrazione senza scrivere una riga di codice.
A differenza invece di un database, dove bisogna realizzare sia la la parte di accesso ai dati che l'UI per amministrarli.
Inoltre, con le liste è possibile registrare sia workflow sia gestori di eventi in modo semplice.
Neo delle liste è quello di non supportare tipi di relazioni complesse come può avvenire con le tabelle su DB ma solo relazioni di tipo lookup.

Per quanto riguarda le tabelle, i vantaggi principali sono le transazioni ACID.

Quindi se la business logic richiede transazioni o comunque il modello dati è complesso, allora un DB è la soluzione.
Altrimenti se il modello non è eccessivamente complesso, non si ha necessità di avere transazioni, ma è richiesto per esempio l’uso di workflow allora le liste sono un’ottima scelta.

Una raccomandazione del team di SharePoint 2007 è quella di non superare il limite di 2000 item per ogni container (dove per container si intende sia la root di una lista che una folder o una sub-folder) per le liste di SharePoint 2007 o meglio, quella di non avere più di 2000 item per vista singola.

A tal proposito questo link torna molto utile.

Questa tabella riassume i principali vantaggi e svantaggi di entrambe le tecnologie.


Vantaggi Tabelle Liste
Gestire relazioni di tipo complesso Si No
Gestire un numero elevato di elementi Si No
Gestire le transazioni Si No
Facile da utilizzare No Si
Supporto nativo ai WorkFlow No Si
Interfaccia standard di utilizzo No Si
Facilità di inserimento di dati binari No Si

Correntemente valutato 5.0 da 1 utenti

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , ,

SharePoint 2007 | MOSS 2007 | WSS 3

SharePoint 2007 Permissions

Molte volte mi è capitato di scontrarmi con le pemission di SharePoint, questo post spiega in modo chiaro le varie permission e le azioni associate.

Correntemente valutato 4.0 da 1 utenti

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

SharePoint 2007 | MOSS 2007

WPF al servizio del Web

L’idea di poter realizzare immagini in WPF e poi pubblicarle sul web è nata un pomeriggio insieme al mio collega Matteo.

Di per se la realizzazione è banale: Il classico HttpHandler che riceve una richiesta con dei parametri, chiama una libreria e ritorna un array di byte al browser.
Quello che è stato fatto invece va ben oltre.

La libreria comprende un controllo chiamato XamlImage che eredita da System.Web.UI.WebControls.Image e che ha diverse proprietà fra cui:

  • ImageType di tipo ImageType (enumerazione con valori Gif, Jpg, Png);
  • XamlFile che contiene il percorso relativo del file Xaml che si vuole renderizzare;
  • Parameter che è una lista di oggetti XamlImageParameter che viene usata per passare i parametri al motore di WPF che effettuerà il bindign prima di renderizzare l’immagine.

Questo è un esempio di configurazione del controllo all’interno della pagina di esempio:

   1: <ff:XamlImage ID="XamlImage1" runat="server" 
   2:     ImageType="Png" 
   3:     XamlFile="~/Xaml/ImageRender.xaml">
   4:     <ff:XamlImageParameter Name="BorderBrush" Value="Blue" />
   5:     <ff:XamlImageParameter Name="BorderThickness" Value="2" />
   6:     <ff:XamlImageParameter Name="CornerRadius" Value="5" />
   7:     <ff:XamlImageParameter Name="RotationAngle" Value="0" />
   8:     <ff:XamlImageParameter Name="ShadowDepth" Value="10" />
   9: </ff:XamlImage>

 

I vari parametri di tipo XmlImageParameter che sono stati inseriti nel controllo, non sono le vere proprietà dei controlli WPF, ma solamente dei nomi delle proprietà che sono bindate ai controlli effettivi. Ma questo ve lo spiega meglio Matteo che ha realizzato la libreria come mi serviva. :-)

Nel metodo Render, il controllo costruisce il link per recuperare l’immagine passando tutti i parametri dichiarati come parametri in querystring. Ma a quale immagine punta il controllo? Punta nient’altro che all’indirizzo del file Xaml dichiarato con l’aggiunta dell’estensione webXaml.

Bisogna quindi andare a registrare nel webconfig l’HttpHandler per gestire questo tipo di richieste, operazione che è stata resa facile grazie al designer del controllo che tramite smarttag permette di fare questa operazione con un solo click.

XamlImageSmartTag

Il problema principale nella realizzazione dell’HttpHandler è stato quello di istanziare e usare gli oggetti di WPF all’interno dell’HttpHandler. WPF funziona in modalità STA ovvero “Single Thread Apartment” mentre ASP.NET no.
Cercando su Google il metodo che viene maggiormente utilizzato è quello descritto in questo post del grande Rick Strahl.

La realizzazione di questa libreria è stata molto utile anche come esercizio per la creazione di designer per controlli custom.

Questa libreria è sicuramente migliorabile sotto diversi aspetti (non ho effettuato nessun tipo di test per quanto riguarda le performance), ma comunque è da prendere come esempio per la creazione di controlli custom e per la realizzazione di HttpHandler un po' diversi dai soliti. :-)

In allegato la libreria con un sito di test.

XamlImageGenerator.zip (603,79 kb)

Correntemente valutato 5.0 da 1 utenti

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , ,

ASP.NET | Custom Control | WPF

Inviare dati preformattati a una stampante

Mi sono appena imbattuto in un problema: inviare una sequenza di byte a una stampante.

La sequenza di byte in questione serve per inviare i comandi necessari a pilotare una stampante per la stampa di etichette adesive.
All’apparenza sembra una cosa da niente, ma utilizzando le classi .NET sembra impossibile inviare dati preformattati (caratteri di escape, file pre-stampati) alla stampante.

Per ovviare a questo problema, la soluzione l’ho trovata qui: http://support.microsoft.com/kb/322091

Correntemente valutato 5.0 da 1 utenti

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

.NET

Visualizzare un User Control come se fosse una pagina

Questo post nasce dall’esigenza di utilizzare i controlli utente in accoppiata al plug-in ThickBox per jQuery.

Per chi non conoscesse jQuery, sto parlando di una libreria JavaScript open source molto avanzata, leggera, estensibile e di facile utilizzo che permette di aggiungere “behavior” all’html. Essa è balzata agli onori della cronaca perché sia Microsoft che Nokia hanno annunciato il loro supporto rispettivamente in Visual Studio e nel Nokia Web Run-Time Platform. ThickBox è un’estensione a questa libreria, e consente di creare delle finestre modali alla Web 2.0 semplicemente utilizzando link html.

Uno delle modalità di utilizzo di ThickBox è quella di aprire appunto un link all’interno di un iframe, permettendo di visualizzare, per esempio in un contesto master-detail, una pagina all’interno della pagina corrente. Un esempio classico è quello del master-detail, abbiamo una GridView e una delle colonne è un link al dettaglio della riga.

Bene, ma concentriamoci su cos’è uno user control. Esso è un tipo di controllo composito che funziona come una pagina Web ASP.NET. È possibile aggiungervi markup e controlli server esistenti e definirne le proprietà e i metodi e incorporarlo nelle pagine Web ASP.NET. Esso è praticamente uguale a una pagina ASP.NET ad eccezione di alcune cose:

  • L'estensione del nome file del user control è ASCX.
  • Al posto di una direttiva @ Page, l’user control contiene una direttiva @ Control che definisce la configurazione e altre proprietà.
  • Nell’user control non sono presenti elementi html, body o form, che devono invece trovarsi nella pagina che contiene il controllo.
  • Gli user control non possono essere eseguiti come file autonomi.

Quest’ultimo punto è quello che mi ha fatto più riflettere. Abbiamo capito che gli user control sono simili alle Page (tant’è che esiste una guida su come convertire User Control in Page), ma allora perché non posso richiamarli direttamente come se fossero delle Pagine?

Se provo a chiamare direttamente un user control questo è il risultato

not_served

Questo perché come detto precedentemente un user control non è in grado di generare da solo i tag html necessari per il corretto funzionamento cioè html, body e soprattutto form.
L’unico modo per risolvere il problema è quello di creare una pagina che faccia da “host” per il nostro controllo, una per ogni controllo che vogliamo visualizzare come se fosse una pagina.

L’idea che ho avuto, banale ma efficace, è quella di realizzare una pagina che permetta questo, caricando in modo dinamico il controllo che si vuole visualizzare.

Per caricare un user control all’interno di una pagina si utilizza il metodo LoadControl della classe Page, che accetta come parametro il path virtuale del controllo da caricare.

   1: String VirtualPath = "~/DateTime.ascx";
   2: UserControl userControl = (UserControl)this.LoadControl(VirtualPath);

Il punto ideale dove caricare i controlli all’interno del ciclo di vita della pagina è il Page_Init, perché questo è il punto dove l’albero dei controlli della pagina viene creato e inizializzato. Se vogliamo che il nostro controllo persisti il suo viewstate, dobbiamo aggiungerlo proprio in questo evento, altrimenti si avrà un disallineamento fra i vari postback. Un’altra cosa da ricordare è che dobbiamo aggiungere il controllo dinamicamente alla pagina a ogni caricamento, nel viewstate viene persistito solo lo stato dei controlli e non i controlli stessi.

   1: protected override void OnInit(EventArgs e)
   2: {
   3:     base.OnInit(e);
   4:  
   5:     String VirtualPath = "~/DateTime.ascx";
   6:     UserControl userControl = (UserControl)this.LoadControl(VirtualPath);
   7:  
   8:     this.Form.Controls.Add(userControl);
   9: }

Questo è il metodo classico per poter aggiungere un controllo dinamicamente a una pagina. Il passo successivo è quello di poter chiamare direttamente il controllo, senza passare per una pagina, almeno in apparenza :-)

Per questo, basta registrare new web.config un HttpHandler che intercetti una determinata richiesta e la gestisca, per esempio la classe che ho implementato serve per gestire la richiesta “*.ascx.aspx” cioè tutte le richieste che finiscono con .ascx.aspx. Ho scelto l’estensione .aspx perché è già registrata su IIS come estensione gestita dall’isapi di ASP.NET

   1: <httpHandlers>
   2:     ...
   3:     ...
   4:     <add verb="*" path="*.ascx.aspx" type="UserControlPage"/>
   5: </httpHandlers>

La classe deriva da Page e permette semplicemente di confondere il motore di ASP.NET facendogli credere di effettuare una richiesta a una pagina esistente invece che a un controllo ascx.

   1: public class UserControlPage: Page
   2: {
   3:     protected override void OnInit(EventArgs e)
   4:     {
   5:         base.OnInit(e);
   6:  
   7:         HtmlForm form = new HtmlForm();
   8:         UserControl userControl = (UserControl)this.LoadControl(this.Request.AppRelativeCurrentExecutionFilePath.Replace(".aspx", ""));
   9:         
  10:         form.Controls.Add(userControl);
  11:         this.Controls.Add(form);
  12:     }
  13:  
  14:     protected override void Render(HtmlTextWriter writer)
  15:     {
  16:         writer.Write(@"<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd""><html xmlns=""http://www.w3.org/1999/xhtml""><head><title></title></head><body>");
  17:         base.Render(writer);
  18:         writer.Write("</body></html>");
  19:     }
  20: }

Utilizzando la proprietà AppRelativeCurrentExecutionFilePath dell’oggetto Request ricaviamo il VirtualPath della richiesta pervenuta a ASP.NET, a questo punto basta eliminare il suffisso .aspx e avremo il path del controllo da caricare.

Tutti i controlli che necessitano di iterazione con l’utente devono essere inseriti all’interno di un form ed essendo la classe UserControlPage una pagina senza markup, bisogna creare un controllo HtmlForm per poter aggiungere il nostro user control in modo corretto.

Infine nel metodo Render è stato aggiunto il codice html necessario per rendere la pagina valida.

A questo punto per richiamare un controllo e visualizzarlo come una comune pagina ASP.NET basterà indicare il percorso aggiungendo l’estensione “.aspx”
Questo è il risultato

print_screen

UserControlPage.zip (38,16 kb)

Correntemente valutato 5.0 da 2 utenti

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , , ,

ASP.NET | ThickBox | UserControl