2009-08-12 6 views
2

Ich habe noch nicht mit Webparts für Sharepoint gearbeitet, muss aber Änderungen an einem Webpart vornehmen, der auf 700 Websites verteilt werden muss. Es ist eine Änderung an einer der Eigenschaften des Webparts, der Wert muss geändert werden. Gibt es eine Möglichkeit, Metadaten für einen Webpart zu erhalten und direkt in der Datenbank zu ändern (ich nehme an, dort ist er gespeichert)?WebPart "Metadaten"?

Hier ist das Szenario: Webpart enthält eine durch Kommas getrennte Liste von Dokumenttypen (interner Typ), die angezeigt werden sollen. Jetzt gibt es neues Dokument. Typen, die zu allen 700 Websites hinzugefügt werden müssen. Ich brauche eine Möglichkeit, Websites aufzulisten, die Webpart-Metadaten abzurufen und diese neuen Dokumenttypen dem Webpart hinzuzufügen. Derzeit gehen sie manuell auf jede Website, klicken auf Bearbeiten, geben den neuen Dokumententyp ein und speichern sie.

Antwort

3

Wie bereits gesagt wurde der richtige Ansatz ist dies eher programmatisch zu erreichen als bearbeiten die Inhaltsdatenbank, die Ihre Installation nicht unterstützt. Ich verwende regelmäßig eine Konsolenanwendung, um dies in einer Websitesammlung durchzuführen, die aus Websites besteht, die aus einer Websitevorlage erstellt wurden.

Hier ist ein Beispiel, das die Title-Eigenschaft eines ListViewWebPart ändert. Aktualisiert, um Code für rekursive Schleife einzuschließen. Ich habe das nicht getestet, aber es sollte funktionieren.

private static void ProcessSiteCollection(string url) 
{ 
    using (SPSite siteCollection = new SPSite(url)) 
    { 
     SPWeb rootWeb = siteCollection.RootWeb; 
     ProcessWebs(rootWeb); 
    } 
} 

private static void ProcessWebs(SPWeb parentWeb) 
{ 
    foreach (SPWeb web in parentWeb.Webs) 
    { 
     try 
     { 
      UpdateWebPart(web); // Set web part properties 
      ProcessWebs(web); // Recursively loop through children 
     } 
     finally 
     { 
      web.Dispose(); 
     } 
    } 
} 

private static void UpdateWebPart(SPWeb web) 
{ 
    using (SPLimitedWebPartManager webPartManager = 
     web.GetLimitedWebPartManager("default.aspx", PersonalizationScope.Shared)) 
    { 
     try 
     { 
      foreach (WebPart webPart in webPartManager.WebParts) 
      { 
        if (webPart.Title == "My Web Part") 
        { 
          ListViewWebPart listViewWebPart = (ListViewWebPart)webPart; 
          listViewWebPart.Title = "Updated Web Part"; 
          webPartManager.SaveChanges(listViewWebPart); 
          web.Update(); 
          break; 
        } 
      } 
     } 
     finally 
     { 
      webPartManager.Web.Dispose(); 
     } 
    } 
} 
+1

Funktioniert das für das Szenario, das ich gerade hinzugefügt habe. Alle Websites wurden von der Tamplate erstellt. Hat sharepoint eine Möglichkeit, diese Websites aufzulisten und eine Webpart-Instanz für jede Website zu erhalten? – epitka

+0

Wie in der ersten Version meiner Antwort erwähnt, ja das kann getan werden, aber ich habe es weggelassen, um die Dinge kurz zu halten. Ich habe jetzt die Antwort mit einem vollständigen Codebeispiel aktualisiert. –

+0

Wo müssen wir Web im Webpart-Manager disponieren? – Evgeny

3

Direkter Zugriff auf die Sharepoint-Inhaltsdatenbanken ist ein großes "Nein, nein". Das ist die offizielle Antwort. :)

Das gesagt, ich habe immer nur in den Inhaltsdatenbanken gesucht und nie versucht, etwas wirklich manuell zu ändern.

Mein Vorschlag wäre, den vorhandenen Webpart zu modifizieren, um die Eigenschaft basierend auf den aktuell festgelegten Eigenschaften zu modifizieren. (Ich gehe davon aus, dass eine aktuell eingestellte Eigenschaft ungültig ist oder aufgrund von Änderungen an der Infrastruktur aktualisiert werden muss.) ... Wenn dies der Fall ist, können Sie die Eigenschaft validieren. Sicherstellen, dass die aktuelle Eigenschaft zu dem geändert wird, was sie sein muss, und/oder sicherstellen, dass zukünftige Eigenschaftenänderungen gültig sind.

Viel Glück!

2

NICHT

Im Ernst, nicht in die Inhaltsdatenbanken gehen und bearbeiten. Auf diese Weise werden Sie nicht mehr unterstützt, wenn etwas passieren sollte und Microsoft wird Sie nicht mehr unterstützen (nicht bis Sie die Datenbank von einer Sicherung auf eine frühere Version zurücksetzen).

können Sie die API verwenden, um webparts in Ihre Websites zugreifen, hier einige Code, bekommen sollten Sie begonnen:

Enumerate page webparts