Guida SharePoint – Gestire la Versioning della Document Library
Con SharePoint 2007 abbiamo a disposizione il totale supporto del versioning degli item.
Tramite la classe SPFile abbiamo quattro metodi che ci tornano utili:
ecco un esempio:
namespace Versioning
{
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
class Program
{
static void Main(string[] args)
{
SPSite site = new SPSite("http://mysite");
SPWeb web = site.AllWebs["Test Site"];
SPList docLib = web.Lists["Documents"];
SPFolder folder = docLib.RootFolder;
SPFile theFile = folder.Files["Documents/test.txt"];
theFile.CheckOut();
theFile.SaveBinary(
ASCIIEncoding.Default.GetBytes("Testo inserito tramite programma."));
theFile.Update();
theFile.CheckIn("File modificato.");
Console.ReadLine();
}
}
}
Ricordiamoci che dentro la SPFolder ha una proprità di nome SubFolders tramite la quale possiamo ottenere tutte subfolders.
Virtualmente tutte le liste possono contenere folders e subfolders e possiamo creare un content type per le nostre folder.
I metodi più usati della classe SPFolder sono:
Mentre quelle della classe SPFile sono:
- Approve
- CheckIn
- CheckOut
- Convert
- CopyTo
- Delete
- Deny
- GetConversionState
- GetConvertedFile
- MoveTo
- OpenBinary
- OpenBinaryStream
- Publish
- Recycle
- SaveBinary
- TakeOffline
- UndoCheckOut
- UnPublish
- Update
Ciao
Differenze tra ListBox e ListView
Mi e vi segnalo un post su StackOverflow sulle differenze tra ListBox e ListView...
spero così di non dimenticarmele più:
http://stackoverflow.com/questions/227231/wpf-listbox-vs-listview-how-to-choose-for-data-binding
Ciao
Model View Presenter
Secondo Wikipedia questo pattern nasce nei primi anni ‘90, da una joint venture fra Apple, IBM e HP.
Altre fonti identificano Mike Potel come ideatore di questo pattern.
L’idea alla base era quella di dividere ulteriormente i layer, creando delle model che siano adattabimi nelle applicazioni multi-tier e multi-client/server.
Rispetto all’MVC i vantaggi di MVP sono:
- un ulteriore vantaggio nei test, creando delle classi mock
- una separazione tra i DTO e la View
- la View è un entità che chiunque può usare, basta che ne conosce l’interfaccia
Per un elenco completo dei vantaggi/svantaggio tra MVP e MVC mi consiglio il seguente articolo: Model View Presenter (MVP) VS Model View Controller (MVC)
Martin Fowler segnala due possibili implementazioni dell’MVP:
Quì potete trovare tante implementazioni di patterns MVC e MVP.
Personalmente mi sono sempre trovato bene con il pattern MVP – Passive View sia su applicazioni WinForm che ASP.NET.
Ciao
Guida SharePoint – Lavorare con le Document Libraries
Precedenti post:
- Guida introduttiva
- Amministrazione e monitoraggio SharePoint 2007
- Deployment
- Introduzione a CAML
- Introduzione all’Object Model
- Usare le Features e Solutions
- Utilizzo dei Site e dei Web
- Introduzione gestione SPList degli SPWeb
- Business Data Catalog
- I content type. Cosa sono e come utilizzarli
- Gestione degli eventi delle liste
- Deploy Event Receiver
Le Document Libraries sono il cavallo di battaglia di MOSS.
Molte realtà utilizzano MOSS solamente per le Document Libraries.
Le Basi
Le Document Libraries è un’altro tipo di list di SharePoint la quale implementa una serie di funzionalità non presenti nelle altre liste.
Per poter accedere alle liste di questo tipo possiamo utilizzare le, già viste, SPList e la classe SPListItem per i suoi item oppure, se volessimo usare qualcosa di più specifico di questa lista, allora possiamo usare le classi specializzate, SPDocumentLibrary e SPFile.
Tramite le classi specializzate abbiamo la possibilità di utilizzare al meglio la Document Libraries; ad esempio l’SPFile espone più metodi per la gestione del versioning degli item.
Document Library Object Model
L’object model a supporto per la gestione delle Document Libraries sono:
Le classi SPFile e SPFolder espongono ottime funzionalità per la gestione delle directory e dei file all’interno della lista.
namespace DocLibrary
{
using System;
class Program
{
static void Main(string[] args)
{
// siteUrl
SPSite sourceSite = new SPSite(args[0]);
// siteName
sourceWeb = sourceSite.AllWebs[args[0]];
foreach (SPList theList in sourceWeb.Lists)
if (theList is SPDocumentLibrary)
Console.WriteLine(theList.Title);
}
}
}
Buona Document Library ;D
Guida SharePoint – Deploy Event Receiver
Precedenti post:
- Guida introduttiva
- Amministrazione e monitoraggio SharePoint 2007
- Deployment
- Introduzione a CAML
- Introduzione all’Object Model
- Usare le Features e Solutions
- Utilizzo dei Site e dei Web
- Introduzione gestione SPList degli SPWeb
- Business Data Catalog
- I content type. Cosa sono e come utilizzarli
- Gestione degli eventi delle liste
Gli event receiver possono essere deployiate in 3 da:
- Programma
- Feature
- Content type
Programma
Se si vuole associare il proprio event receiver ad una sola instanza di una lista invece che a tutte le liste, possiamo registrare il nostro event receiver programmaticamente:
SPWeb webSite = new SPSite("http://win2k3r2lab").OpenWeb();
SPList theList = webSite.Lists["Tasks"];SPEventReceiverDefinition newReceiver = theList.EventReceivers.Add(); newReceiver.Class = "Receiver.ReceiverClass"; newReceiver.Assembly = "Receiver,Version=1.0.0.0,Culture=neutral,PublicKeyToken=abc123abc123abc"; newReceiver.Sequence = 5000; newReceiver.Type = SPEventReceiverType.ItemUpdated; newReceiver.Update();
da notare dalla 6 alla 8 per associare l’event receiver alla lista.
Feature
Deployiando tramite Feature, abbiamo la possibilità di associare gli event receivers al tipo di lista sulle quali vogliamo lavorare, specificando l’ID del template della lista.
Ecco un esempio:
Feature.xml
Elements.xml
EventLogger ItemAdded 10000 EventLogger, Version=1.0.0.0, Culture=neutral,PublicKeyToken=5d1d751131e0aacf EventLogger.ListEventLogger EventLogger ItemUpdated 10000 EventLogger, Version=1.0.0.0, Culture=neutral,PublicKeyToken=5d1d751131e0aacf EventLogger.ListEventLogger EventLogger ItemDeleted 10000 EventLogger, Version=1.0.0.0, Culture=neutral,PublicKeyToken=5d1d751131e0aacf EventLogger.ListEventLogger
Per una lista completa degli ID dei list template fate riferimento alle msdn.
Content Type
Deployiare il tutto tramite i content type segue la stessa logica del deploiare una feature.
Bisognerà quindi creare una dll con strongly name, firmare l’assembly e salvarlo in GAC del server di destinazione.
Ciao
SharePoint 2010 Beta e Office 2010 Beta
Finalmente è pubblica la beta di SharePoint 2010 a questo indirizzo:
http://sharepoint2010.microsoft.com/Pages/default.aspx
mentre potete scaricare Office 2010 beta da quest’altro indirizzo:
http://www.microsoft.com/office/2010/en/default.aspx
Per tutti gli altri prodotti 2010 fate pure riferimento all'url: http://www.microsoft.com/2010/en/
Buon download
Guida SharePoint – Gestione degli eventi delle liste
Precedenti post:
- Guida introduttiva
- Amministrazione e monitoraggio SharePoint 2007
- Deployment
- Introduzione a CAML
- Introduzione all’Object Model
- Usare le Features e Solutions
- Utilizzo dei Site e dei Web
- Introduzione gestione SPList degli SPWeb
- Business Data Catalog
- I content type. Cosa sono e come utilizzarli
Gli eventi sono un’altro aspetto interessante di SharePoint 2007.
Già presenti nelle versioni precedenti, erano limitate alle document libraries, vedono la loro espansione in questa versione di SharePoint.
Gli eventi vengono generati per svariarti motivi:
- Modifica di list items
- Creazione di una nuova list
- Nuova list items
- Rimozione list items
- etc
Per una lista completa degli eventi gestiti potete fare riferiemnto alle msdn.
Per poter creare un receiver correttamente funzionante dovremo deploiare in GAC una libreria .NET strong-typed e far derivare la nostra classe da una classe EventReceiver sulla quale dovremo lavoare, ad esempio: SPItemEventReceiver o SPListEventReceiver.
Entrambe derivano dalla classe abstract SPEventReceiverBase.
Creazione di un Event Receivers
Creare un event receivers è semplicissimo. Si può riassumere tutto in 4 passi:
- Creare una classe che eredita dalla SPListEventReceiver o dalla SPItemEventReceiver
- Firmare la libreria con uno strong name
- Deploiare la libreria nella Global Assembly Cache
- Deploiare l’event receiver tramite una feature, con unc ontent type etc etc
Creazione di un event receiver per una lista
Un evento sulla lista viene generato quando un metadato della lista viene modificato.
Ad esempio potremmo creare un receiver che si attiva quando un campo viene aggiunto o rimosso dalla lista.
Possiamo stare in ascolto e ricevere una notifica, sia allo scaturirsi (FieldAdding) dell’evento che subito dopo che l’evento è stato scaturito (FieldAdded).
Tutti gli eventi accettano un parametro che è l’SPListEventProperties fate riferimento alla pagina msdn per l’elenco delle proprietà.
Prima di creare l’event receiver, accertiamoci d’aver installato VSeWSS se lavoriamo con Visual Studio 2008.
Se è installato creiamo un nuovo progetto di tipo Empty:
_ad8a278b-9fd4-4d1d-ae26-a36cd2a21e81.jpg)
e inserite il seguente codice:
namespace ListMetaLogger
{
using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
public class ListMetaLogger : SPListEventReceiver
{
public override void FieldAdded(SPListEventProperties properties)
{
LogEvent(properties, "FieldAdded");
}
public override void FieldAdding(SPListEventProperties properties)
{
LogEvent(properties, "FieldAdding");
}
public override void FieldDeleting(SPListEventProperties properties)
{
LogEvent(properties, "FieldDeleting");
}
public override void FieldDeleted(SPListEventProperties properties)
{
LogEvent(properties, "FieldDeleted");
}
public override void FieldUpdated(SPListEventProperties properties)
{
LogEvent(properties, "FieldUpdated");
}
public override void FieldUpdating(SPListEventProperties properties)
{
LogEvent(properties, "FieldUpdating");
}
private void LogEvent(SPListEventProperties properties, string eventName)
{
StreamWriter sw = File.AppendText(@"C:\listeventlog.txt");
StringBuilder sb = new StringBuilder();
sb.AppendFormat("[{0}] {1} Event Occurred:\n", DateTime.Now.ToString(), eventName);
sb.AppendFormat("\tList : {0}", properties.ListTitle);
sb.AppendFormat("\t{0} - Field {1}", properties.EventType.ToString(), properties.FieldName);
sw.WriteLine(sb.ToString());
sw.Close();
}
}
}
Il codice di sopra genererà un file C:\listeventlog.txt il quale conterrà l’elenco di tutti gli eventi scaturiti dalle liste.
Creazione per un event receivers per gli Items
La gestione degli eventi sugli item è uguale a quella delle liste.
Negli eventi scaturiti la classe con cui lavoreremo sarà la SPItemEventProperties:
namespace EventLogger
{
using System;
using System.IO;
using Microsoft.SharePoint;
public class ListEventLogger : SPItemEventReceiver
{
public override void ItemAdded(SPItemEventProperties properties)
{
WriteTextToLog(string.Format("[{0}] Item Added : {1}", properties.ListItem.Title, DateTime.Now.ToString()));
}
public override void ItemDeleted(SPItemEventProperties properties)
{
WriteTextToLog(string.Format("[{0}] Item Deleted : {1}", properties.ListItem.Title, DateTime.Now.ToString()));
}
public override void ItemUpdated(SPItemEventProperties properties)
{
WriteTextToLog(string.Format("[{0}] Item Updated : {1}", properties.ListItem.Title, DateTime.Now.ToString()));
}
private void WriteTextToLog(string text)
{
StreamWriter logFile = File.AppendText(@"C:\listlog.txt");
logFile.Write(text + "\n");
logFile.Close();
}
}
}
Da notare che potremmo bloccare, ad esempio, l’update di un item nella lista settando a true la proprietà Cancel.
Nel prossimo post vedremo come effettuare il deploy di queste librerie.
Model View Controller le origini
C’è un pò (tanta) confusione intorno ai pattern di separation of concerns.
Con i seguenti post provo a chiarire e spero di non aprire dei dibattiti infiniti.
Il primo pattern che andrò a spulciare è quello che potremmo definire: classic MVC
Com’è possibile anche leggere da Wikipedia, questo pattern nasce nel 1979 grazie ad un’idea di Trygve Reenskaug il quale lavorava su Smalltalk.
L’idea alla base è quella di dividere i compiti delle applicazioni in layer, in modo tale da ottenere una chiara divisione tra il domain object e la sua rappresentazione, introducendo così il meccanismo denominato Observer-Synchronization, il quale permette di rappresentare in più punti della nostra applicazione lo stesso domain object senza che questo si preoccupi della sua rappresentazione.
I Layer
Model
Rappresenta il domain object. Può esser ricavata da uno o più DAL gestiti dall’applicazione, ciò significa che i suoi dati possono esser ricavati da un database, da un file xml, da un file testuale o da tutti e tre contemporaneamente.
Non esiste un rapporto 1-a-1 con il Controller o con la View.
View
Visualizza la Model. Può essere una Windows Form, una pagina ASPX, come può essere un file di testo o un file XML.
La View comunica direttamente con la Model.
Controller
Interpreta gli input dell’utente (mouse, tastierta etc), notifica l’input alla model e/o cambia la view con quella corretta.
Questa è l’immagine che ho trovato che meglio rappresenta questa logica:

Seguiamo l’immagine di sopra:
- Il controller riceve un input da parte dell’utente
- Se l’input è valido il comando viene girato alla model
- La model cambia stato
- La view riceve la notifica del cambio di stato
- La view visualizza i dati della model
Ok, questa era l’implementazione classica, vedremo le altre implementazioni nei prossimi post.
Se volete altre informazioni fate riferimento pure alle msdn.
Ciao
Fine Evento Community Tour Bologna: Tiriamo le somme
La sessione su ASP.NET MVC tenuta in quel di Bologna grazie al supporto di DotDotNet, si è conclusa ieri.
Voglio ringraziare, in ordine sparso, per il loro supporto:
e tutti coloro che sto dimenticando.
Io e Ugo speriamo di poter ripetere il tutto anche in altre parti d'Italia (community fatevi vive) e, personalmente, spero di poter proporre anche sessioni su SharePoint.
Grazie e alla prossima
Guida SharePoint – I content type. Cosa sono e come utilizzarli.
Precedenti post:
- Guida introduttiva
- Amministrazione e monitoraggio SharePoint 2007
- Deployment
- Introduzione a CAML
- Introduzione all’Object Model
- Usare le Features e Solutions
- Utilizzo dei Site e dei Web
- Introduzione gestione SPList degli SPWeb
- Business Data Catalog
I Content Type (CT) sono un’altra caratteristica nata con SharePoint 2007.
Come il nome suggerisce, definiscono il tipo contenuto dalle librerie presenti sui nostri SharePoint site.
Aiutandoci con le definizioni trovate nelle msdn possiamo dire che: I Content Types fanno parte dei nuovi concetti chiave di Windows SharePoint Service 3.0 utilizzati per tutte le funzionalità e i servizi offerti.
Il concetto dietro i content type è la creazione di collezioni di settaggi riusabili i quali permettono di lavorare sui metadati e il comportamento dei documenti/item in un modo centralizzato e riusabile.
I content type tornano utili quando vogliamo salvare/visualizzare nella stessa list o document library più tipi differenti.
Fate riferimento a questo link: http://office.microsoft.com/en-us/sharepointtechnology/HA100974931033.aspx per la creazione di un nuovo Content Type.
Una delle capacità dei CT è l’ereditarietà.
Potremmo creare un nuovo CT ereditando, ad esempio, dal tipo Folder in modo da aggiungere i settaggi che ci tornano utili per la nostra lista.
Possiamo fare riferimento alla seguente immagine, prelevata da Creating Content Types Based on Other Content Types:
_5cefdd64-23e7-4246-a60e-8655b9080abe.gif)
Il nuovo tipo creato, il quale ha ereditato il CT Folder, potrebbe dividere gli items all’interno della lista per folders cliente.
Nel qual caso per ottenere gli items all’interno della folder faremo:
namespace ConsoleApplication1
{
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
class Program
{
static void Main(string[] args)
{
SPSite site = new SPSite(args[0]);
SPWeb web = site.AllWebs["Web Test"];
SPList parentList = web.Lists["Clienti"];
foreach (SPListItem order in parentList.Folders)
{
Console.WriteLine("Ordine : {0}", order["Nome"]);
Console.WriteLine("Numero : {0}", order["Numero ordine"]);
SPQuery orderItemsQuery = new SPQuery();
orderItemsQuery.Folder = order.Folder;
SPListItemCollection orderItems = parentList.GetItems(orderItemsQuery);
foreach (SPListItem orderItem in orderItems)
{
Console.WriteLine("Item {0}: {1} {2}",
orderItem["OrderItem"],
orderItem["SKU"],
orderItem["Title"]);
}
}
Console.ReadLine();
}
}
}
Enjoy
Statistics