Grande cosa le webparts in Asp.net 2.0: la possibilita' di offrire interfacce personalizzabili agli utenti, con la possibilita' per ognuno di salvare le proprie impostazioni e' una gran bella cosa.

Tuttavia ci si puo' trovare in una situazione simile alla mia:

piccolo portale realizzato con le webpart, con lo storage delle personalizzazioni su un Ms SQLServer 2000; l'idea e' quella di permettere la personalizzazione delle pagine tramite le webparts, ma tali dati devono essere legati non all'utente che le realizza, ma alla singola pagina.

Di default la classe SQLPersonalizationProvider prevede personalizzazioni legate esclusivamente all'utente che le realizza, come fare a fare in modo che vengano salvate usando come discriminante l'indirizzo della pagina?
Semplice, 'illudendo' il personalization provider che il nome della pagina sia lo username!

Tralasciando la realizzazione di una pagina funzionante con le webparts (si trovano in rete decine di tutorials,e cmq si presume che chi legga questo articolo quel passo lo abbia gia' superato) passiamo alla realizzazione di una classe custom derivata da SQLPersonalizationProvider:

[sourcecode language='vb']

Imports Microsoft.VisualBasic

Public Class CustomSqlPersonalizationProvider
Inherits SqlPersonalizationProvider

Protected Overrides Sub LoadPersonalizationBlobs(ByVal _webPartManager As WebPartManager, ByVal _path As String, ByVal _userName As String, ByRef _sharedDataBlob() As Byte, ByRef _userDataBlob() As Byte)
Dim pagina As String
pagina = HttpContext.Current.Request.QueryString("page")
MyBase.LoadPersonalizationBlobs(_webPartManager, _path, pagina, _sharedDataBlob, _userDataBlob)
End Sub

Protected Overrides Sub ResetPersonalizationBlob(ByVal _webPartManager As WebPartManager, ByVal _path As String, ByVal _userName As String)
Dim pagina As String
pagina = HttpContext.Current.Request.QueryString("page")
MyBase.ResetPersonalizationBlob(_webPartManager, _path, pagina)
End Sub

Protected Overrides Sub SavePersonalizationBlob(ByVal _webPartManager As WebPartManager, ByVal _path As String, ByVal _userName As String, ByVal _dataBlob() As Byte)
Dim pagina As String
pagina = HttpContext.Current.Request.QueryString("page")
MyBase.SavePersonalizationBlob(_webPartManager, _path, pagina, _dataBlob)
End Sub

End Class
[/sourcecode]

Di cosa si tratta? La nuova classe ereditata da SQLPersonalizationProvider esegue l'override dei metodi dedicati al salvataggio, caricamento e reset delle impostazioni e li altera in modo da utilizzare come identificativo per i dati salvati sul DB il valore del parametro 'page' passato in querystring anziche lo username dell'utente collegato.

A questo punto, dobbiamo modificare il web.config in modo da far utilizzare questa nuova classe al posto della tradizionale:

[sourcecode language='xml']



type="CustomSqlPersonalizationProvider"
connectionStringName="SQLConnString"
applicationName="/" />










[/sourcecode]

Passando quindi alla nostra pagina il parametro 'page' dalla querystring potremo differenziare le personalizzazioni:

le modifiche effettuate su http://sito/default.aspx?page=pagina1 saranno quindi separate e distinte da quelle su http://sito/default.aspx?page=pagina2 e cosi' via.

interessante notare che con questo metodo la creazione della nuova pagina avviene come su un wiki: cercando infatti di accedere a una pagina attualmente non presente viene presentata una pagina con le webpartzones vuote, pronte per essere 'riempite'.