2012-03-26 13 views
0

Beim Feature-Upgrade muss ein Feld zur Listenansicht hinzugefügt werden, das auf eine neue Spalte im Inhaltstyp zeigt.Feld zur Listenansicht hinzufügen FeatureUpgrading - Identifizieren der Listenansicht

Momentan basiert mein Code auf der Annahme, dass der Titel der Ansicht ist Alle Links (ich habe es durch den Debugger). So ist es das Snippet:

   SPView view; 
       try 
       { 
        view = list.Views["All Links"]; 
       } 
       catch 
       { 
        view = list.Views[0]; // just in case 
       } 
       view.ViewFields.Add("NewField"); 
       view.Update(); 

Jetzt funktioniert es, aber die Annahme ist, dass der Titel der Ansicht ist Alle Verbindungen (oder es gibt nur einen Blick [0]). Ich habe den Titel weder in schema.xml noch an anderen Stellen gefunden. Was ist der beste sichere Weg, um die Ansicht im Code zu aktualisieren? (oder vielleicht gibt es eine bessere Möglichkeit, es zu aktualisieren, zum Beispiel mit XML, aber ich weiß, wenn Feature aktualisiert wird schema.xml-Datei wird nicht berücksichtigt).

Danke, Pawel

Antwort

1

Um den Standardtitel einer Ansicht innerhalb schema.xml zu finden, Blick auf das Attribut Displayname des entsprechenden der View element. Wenn der Attributwert "Alle Links" ist, könnten Sie in Ordnung sein.

Wenn, wie im Fall der Out-of-the-Box-Links-List-Definition, der Wert etwa $Resources:core,All_Links; ist, dann gibt es mehr zu berücksichtigen. Wenn Ihre Websites nur Englisch sind, können Sie immer noch nach "Alle Links" suchen. Aber wenn Sie andere Sprache Seiten haben, müssen Sie so etwas wie dies tun:

string title = SPUtility.GetLocalizedString(
    "$Resources:All_Links;", 
    "core", 
    web.Language); 
SPView view = list.Views[title]; 

Nun, auch wenn der Attributwert „Alle Verbindungen“ oder, wenn alle Standorte in Englisch sind, gibt es immer noch die Möglichkeit (insbesondere in einem Upgrade-Ereignis), dass der Titel vom Standard geändert wurde. In diesen Fällen suche ich lieber nach BaseViewID. Leider gibt es nicht einen Indexer für BaseViewID, so verwende ich den folgenden Code:

private SPView GetView(SPList list, string id) 
{ 
    SPView view = null; 
    foreach (SPView v in list.Views) 
    { 
     if (id == v.BaseViewID) 
     { 
      view = v; 
      break; 
     } 
    } 
    return view; 
} 
0

Eine weitere Möglichkeit, Ihre Ansicht abzurufen, indem unter Verwendung von SPWeb.GetViewFromUrl("Lists/{List_Name}/{View_Name}.aspx"), vgl msdn article

Dann so etwas wie dies Ihr Code aussehen würde (wenn Ihre Funktion Web ist - scoped):

SPWeb web = (SPWeb)properties.Feature.Parent;  
SPView view = web.GetViewFromUrl("Lists/<List_Name>/All Links.aspx"); 
view.ViewFields.Add("NewField"); 
view.Update();