2010-05-04 16 views
9

Questo codice utilizzato per lavorare in WSS 3.0/MOSS 2007 in FeatureReceiver.FeatureActivated:"La vista specificato non è valido" in chiamata a LimitedWebPartManager.AddWebPart in SharePoint 2010

using (SPLimitedWebPartManager limitedWebPartManager = Site.GetLimitedWebPartManager("default.aspx", PersonalizationScope.Shared)) { 
    ListViewWebPart listViewWebPart = new ListViewWebPart { 
     Title = title, 
     ListName = list.ID.ToString("B").ToUpper(), 
     ViewGuid = view.ID.ToString("B").ToUpper() 
    }; 
    limitedWebPartManager.AddWebPart(listViewWebPart, zone, position); 
} 

Sto cercando di convertire in SharePoint 2010 e ora viene a mancare con:

System.ArgumentException: The specified view is invalid. 
at Microsoft.SharePoint.SPViewCollection.get_Item(Guid guid) 
at Microsoft.SharePoint.WebPartPages.ListViewWebPart.EnsureListAndView(Boolean requireFullBlownViewSchema) 
at Microsoft.SharePoint.WebPartPages.ListViewWebPart.get_AppropriateBaseViewId() 
at Microsoft.SharePoint.WebPartPages.SPWebPartManager.AddWebPartInternal(SPSupersetWebPart superset, Boolean throwIfLocked) 
at Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.AddWebPartInternal(WebPart webPart, String zoneId, Int32 zoneIndex, Boolean throwIfLocked) 
at Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.AddWebPart(WebPart webPart, String zoneId, Int32 zoneIndex) 

è interessante notare che quando l'eseguo da un test di unità funziona, non riesce solo in FeatureActivated. Quando metto a punto con riflettore si sta venendo a mancare su questa linea:

this.view = this.list.LightweightViews[new Guid(this.ViewGuid)]; 

list.LightweightViews restituisce solo un punto di vista, la visualizzazione predefinita, anche se list.Views restituisce tutti. Quando si esegue da un'unità test LightweightViews restituisce tutte le mie visualizzazioni. Non ho idea di cosa intenda dire LightweightViews e sono a corto di idee. Qualcun altro ne ha?

risposta

5

per farlo funzionare, basta fare il seguente:

  • Non impostare la proprietà viewguid dell'oggetto ListViewWebPart (lasciare vuoto)
  • chiamata al metodo AddWebpart

Sarà genera un nuovo viewguid associato a una nuova vista nascosta. Quindi, se si desidera personalizzare questa vista, recuperarla dall'elenco e personalizzarla.

+0

Questa alternativa ha funzionato anche per me: 1. Non impostare ViewGuid, 2. AddWebPart, 3. set ViewGuid, 4 . Salva I Cambiamenti – jumbo

3

Speriamo che nessuno abbia mai riscontrato questo problema o addirittura abbia visto questa domanda. Nel caso sfortunato si ottiene lo stesso problema non ho una soluzione specifica. Alla fine ha appena iniziato a lavorare per me (8 ore dopo). Posso dirvi quello che ho fatto giusto prima che iniziasse a funzionare e speriamo che possa essere d'aiuto:

Sono passato attraverso l'interfaccia utente e ho impostato la vista che stavo cercando di impostare la web part visualizzazione elenco come vista predefinita. Credo che sia quello che ha risolto e non ho idea del perché.

Alcune altre note sul problema:

  • creo tutte le mie liste e vista attraverso il codice
  • RunWithElevatedPrivileges non ha aiutato
  • Instantiating una nuova SPWeb in funzione attivata non ha aiutato
  • Impostazione ListViewXml = view.HtmlSchemaXml invece di impostare ViewGuid lo ha reso non in crash ma la vista era sbagliata quando questo codice veniva eseguito in FeatureActivated ma corretto quando eseguito in un unit test.

Il meglio che posso fare, mi dispiace. Se hai questo problema, buona fortuna!

1

Dopo aver letto gli articoli this e this ho trovato la soluzione ancora più semplice. Quando aggiungi listviewwebpart a una pagina qualsiasi, webpart crea automaticamente una nuova vista nascosta nell'elenco, che è associato a questa web part (puoi controllarlo in SharePoint Manager).
Quando si passa alla vista per l'interfaccia utente di listviewwebpart, è sufficiente ottenere copia dei campi dalla vista selezionata e spingerla nella sua vista nascosta.

Tutto ciò che serve è ottenere questa vista per ID, aggiungere \ rimuovere i campi necessari e aggiornare la vista. Qualcosa di simile a questo:

  var wpMngr = web.GetLimitedWebPartManager(workspaceWeb.Url + "/default.aspx", PersonalizationScope.Shared); 
      var attendeeListViewWebPart = 
       (ListViewWebPart)wpMngr.WebParts.Cast<WebPart>().FirstOrDefault(w => w.Title == Lists.AttendeesList); 
      var list = workspaceWeb.Lists[Lists.AttendeesList]; 
      var view = list.Views.Cast<SPView>().FirstOrDefault(w => w.ID.ToString("B").Equals(attendeeListViewWebPart.ViewGuid, StringComparison.OrdinalIgnoreCase)); 
      view.ViewFields.DeleteAll(); 
      view.ViewFields.Add... 
      view.Update(); 

Secondo articoli, cann't aggiornare proprietà ViewGuid per ListViewWebPart.

1

Oggi ho combattuto anche con questo.

Per alcuni strani motivi il codice che hai fornito funziona in alcuni casi ma non in altri.

Non ho avuto il tempo di approfondire l'argomento ma quello che posso dire è che se si desidera utilizzare XsltListViewWebPart (che è la sostituzione di ListViewWebPart in SharePoint 2010), si eliminerà questo fastidioso "bug".

Ho appena provato in me stesso.

Spero che aiuti!

1

mi è stato sempre lo stesso errore con un XsltListViewWebPart:

Exception: System.ArgumentException: The specified view is invalid. 
at Microsoft.SharePoint.SPViewCollection.get_Item(Guid guid) 
at Microsoft.SharePoint.SPList.GetView(Guid viewGuid) 
at Microsoft.SharePoint.SPList.GetView(String viewGuid) 
at Microsoft.SharePoint.WebPartPages.BaseXsltListWebPart.EnsureView() 
at Microsoft.SharePoint.WebPartPages.BaseXsltListWebPart.get_AppropriateBaseViewId() 
at Microsoft.SharePoint.WebPartPages.SPWebPartManager.AddWebPartInternal(SPSupersetWebPart superset, Boolean throwIfLocked) 
at Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.AddWebPartInternal(WebPart webPart, String zoneId, Int32 zoneIndex, Boolean throwIfLocked) 
at Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.AddWebPart(WebPart webPart, String zoneId, Int32 zoneIndex) 

Dal SPList.GetView è un metodo pubblico, ho provato in PowerShell utilizzando il GUID dal mio nuovo punto di vista. Ha funzionato bene.

Ho capito che il problema era il contesto. Avevo creato la mia vista poco prima del compito ViewGuid. Quando mi sono trasferito alla creazione di mio punto di vista al di fuori della SPLimitedWebPartManager, il codice ha funzionato senza errori:

SPView view = CreateHiddenView(list); 
using (SPLimitedWebPartManager manager = file.GetLimitedWebPartManager(PersonalizationScope.Shared)) 
{ 
    try 
    { 
     XsltListViewWebPart webpart = new XsltListViewWebPart(); 
     webpart.ListName = list.ID.ToString("B").ToUpperInvariant(); 
     webpart.TitleUrl = list.DefaultViewUrl; 
     webpart.WebId = list.ParentWeb.ID; 
     webpart.Title = list.Title; 
     webpart.ViewGuid = view.ID.ToString("B").ToUpperInvariant(); 
     manager.AddWebPart(webpart, "Right", 1); 
    } 
    finally 
    { 
     manager.Web.Dispose(); 
    } 
} 
Problemi correlati