Scenario:
avete sviluppato un portale web utilizzando il WebPart Framework, avete eseguito la fase di test e avete rilasciato il sistema al cliente, che lo sta collaudando inserendo dati a iosa nel db mediante le vostre webpart. Il cliente vi chiede delle modifiche e siete costretti a sostituire alcune properties dichiarate [Personalizable] con delle altre che gestiscono dati in maniera differente.
...e i dati già inseriti dal cliente e da noi persistiti nelle tabelle di ASP.NET ??!?? Sappiamo benissimo che sostituendo proprietà di personalizzazione rendiamo "orfani" i dati scritti nelle tabelle di personalizzazione. Come fare per agganciarli nuovamente e "travasarli" nelle nuove properties?
Soluzione:
Lavoriamo con l'interfaccia IVersioningPersonalizable. Espone un unico metodo:

implementando questa interfaccia avete la possibilità di mappare i dati di una proprietà e, se questa viene rimossa, "spostarli" in un'altra. Il metodo Load riceve un dizionario contenente tutti i dati orfani inseriti in tabella dalla proprietà non più esistente.
public new void Load(IDictionary datiOrfani)
{
foreach (DictionaryEntry de in datiOrfani)
{
if (de.Key.ToString() == "Prop1")
{
_prop3 = de.Value.ToString();
}
}
}
Nel codice di esempio se i dati orfani sono stati in precedenza scritti dalla property Prop1, i suoi dati sono ora mappati nella property Prop3.
powered by IMHO 1.3
Mi collego al mio precedente post #2
Piccolo scenario...avete un sito e i contenuti li inserite grazie a webparts, ognuna con il suo specifico compito di farvi editare contenuti e visualizzarli, opportunamente formattati, nel punto in cui le avete sistemate nelle vostre pagine, in apposite Zones. Sapete perfettamente che se non create verbi custom nelle webparts, il WebPartZone farà apparire il menù a tendina con i verbi di default o perlomeno customizzati, secondo quanto spiegato nel post suddetto.
Se avete bisogno di far modificare i contenuti del vostro sito ad un utente tipo "PowerUser", quindi può accedere alla webpart in modalità Edit ma non deve vedere il menù a tendina accanto ad essa, potete fare in questo semplice modo (in grassetto è indicato il frammento di codice aggiunto al vecchio esempio):
protected override void OnCreateVerbs(WebPartVerbsEventArgs e)
{
base.OnCreateVerbs(e);
WebPartManager wpm = (WebPartManager) WebPartManager.GetCurrentWebPartManager(this.Page);
this.EditVerb.Visible = false;
Collection verbs = new Collection();
HttpContext ctx = HttpContext.Current;
if (ctx.Request.IsAuthenticated)
{
WebPartVerb editVerb = new WebPartVerb("editVerb", new WebPartEventHandler(HandleEditClick));
verbs.Add(editVerb);
if (wpm.Personalization.Scope == PersonalizationScope.Shared)
{
editVerb.Text = "Modifica Web Part condivisa";
}
else
{
editVerb.Text = "Modifica Web Part";
}
if (ctx.User.IsInRole("Administrator"))
{
editVerb.Visible = true;
DeleteVerb.Visible = true;
AllowLayoutChange = true;
CloseVerb.Visible = true;
ConnectVerb.Visible = true;
ExportVerb.Visible = true;
HelpVerb.Visible = true;
MinimizeVerb.Visible = true;
RestoreVerb.Visible = true;
}
else
{
editVerb.Visible = false;
DeleteVerb.Visible = false;
AllowLayoutChange = false;
CloseVerb.Visible = false;
ConnectVerb.Visible = false;
ExportVerb.Visible = false;
HelpVerb.Visible = false;
MinimizeVerb.Visible = false;
RestoreVerb.Visible = false;
}
}
e.Verbs = new WebPartVerbCollection(verbs);
}
Fatto ciò, tutte le webpart che inserite nelle zone gestite dal custom WebPartZone non mostreranno il menu a tendina nel caso in cui l'utente non sia un Administrator.
powered by IMHO 1.3
Io non lo sapevo, esiste un progetto spaziale, eletto dall'UNESCO "Progetto del XXI Secolo", che ha lo scopo di
lanciare un satellite entro il prossimo anno e che tornerà sulla Terra fra
50.000 anni. In esso, alla partenza, saranno inseriti i messaggi di tutte le
persone del mondo che vorranno dire qualcosa ai posteri. E questi ultimi, in
teoria, potranno riceverli al suo ritorno. Molto pittoresco.
Se volete lasciare il vostro "buon" messaggio: http://www.keo.org/
powered by IMHO 1.3
Secondo post sull'argomento WebParts Framework.
Vediamo come "rivisitare" un altro componente che
serve per ospitare le Web Parts in zone diverse della pagina web: il
WebPartZone.
Prima di tutto, cosa offre? Il WebPartZone deriva dalla
classe WebPartZoneBase, che a sua volta deriva da WebZone, che deriva da
CompositeControl; in effetti una WebPartZone non è altro che un controllo Web
composto in grado di ospitare al suo interno altri controlli compositi, le
Web Parts.
In questo post vorrei porre l'attenzione su una caratteristica
in particolare: i Verbi.
Si da per assunta la conoscenza di base
del Web Part Framework quindi non spiego cosa sono i Verbi, bensì illustro un
semplice modo per estendere il WebPartZone e far si che ad ogni Web Part
condivisa o personalizzata per uno specifico utente, inclusa nella
Zone, venga associato il verbo "Edit".
protected override void OnCreateVerbs(WebPartVerbsEventArgs e)
{
base.OnCreateVerbs(e);
this.EditVerb.Visible = false;
Collection verbs = new Collection();
HttpContext ctx = HttpContext.Current;
if (ctx.Request.IsAuthenticated)
{
WebPartVerb editVerb = new WebPartVerb("editVerb", new WebPartEventHandler(HandleEditClick));
verbs.Add(editVerb);
if (WebPartManager.Personalization.Scope == PersonalizationScope.Shared)
{
editVerb.Text = "Modifica Web Part condivisa"
}
else
{
editVerb.Text = "Modifica Web Part"
}
}
e.Verbs = new WebPartVerbCollection(verbs);
}
In questo modo ogni webpart aggiunta nella Zone avrà,
cliccando, nel suo menù a tendina il suddetto verbo, oltre ai verbi di
default.
void HandleEditClick(object sender, WebPartEventArgs e)
{
WebPartManager wpm = (WebPartManager) WebPartManager.GetCurrentWebPartManager(this.Page);
wpm.DisplayMode = WebPartManager.EditDisplayMode;
WebPart wp = e.WebPart;
if (wp != null && wp != wpm.SelectedWebPart)
wpm.BeginWebPartEditing(wp);
}
powered by IMHO
1.3