2010-05-04 14 views
9

Este código se utiliza para trabajar en WSS 3.0/MOSS 2007 en FeatureReceiver.FeatureActivated:"La vista especificado no es válido" en la llamada a LimitedWebPartManager.AddWebPart en 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); 
} 

Estoy tratando de convertir a SharePoint 2010 y ahora falla 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) 

Curiosamente cuando lo ejecuto desde una unidad de prueba funciona, sólo fracasa en FeatureActivated. Cuando la depuración con el reflector está fallando en esta línea:

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

list.LightweightViews sólo devuelve un punto de vista, la vista predeterminada, a pesar de que list.Views devuelve todos ellos. Cuando se ejecuta desde una prueba de unidad, LightweightViews devuelve todas mis vistas. No tengo idea de lo que se supone que significa LightweightViews y me estoy quedando sin ideas. ¿Alguien más tiene alguno?

Respuesta

5

para hacer que funcione, simplemente haga lo siguiente:

  • No establezca la propiedad viewguid del objeto listviewwebpart (dejar en blanco)
  • llamada al método AddWebpart

Será generar un nuevo viewguid asociado a una nueva vista oculta. Luego, si desea personalizar esta vista, recupérela de la lista y personalícela.

+0

Esta alternativa también trabajó para mí: 1. No coloque ViewGuid, 2. AddWebPart, 3. conjunto ViewGuid, 4 . Guardar cambios – jumbo

3

Esperemos que nadie tenga este problema o incluso vea esta pregunta. En el desafortunado caso de que tenga el mismo problema, no tengo una solución específica. Finalmente comenzó a funcionar para mí (8 horas más tarde). Puedo decirles lo que hice justo antes de que comenzara a funcionar y espero que ayude:

Entré a través de la IU y configuré la vista a la que estaba tratando de configurar el elemento web de vista de lista como vista predeterminada. Creo que eso es lo que lo solucionó y no tengo idea de por qué.

Algunas otras notas sobre el problema:

  • puedo crear mis listas y vistas a través de código
  • RunWithElevatedPrivileges no ayudaron a
  • Crear instancias de un nuevo SPWeb en función activada no ayudó a
  • Ajuste ListViewXml = view.HtmlSchemaXml en lugar de establecer ViewGuid no se colgó, pero la vista era incorrecta cuando este código se ejecutó en FeatureActivated pero es correcto cuando se ejecuta en una prueba unitaria.

Lo mejor que puedo hacer, lo siento. Si tienes este problema, ¡buena suerte!

1

Después de leer this y this artículos encontré la solución aún más fácil. Cuando agrega listviewwebpart a cualquier página, webpart crea automáticamente una nueva vista oculta en la lista, que está asociada a este sitio web (puede verificarlo en SharePoint Manager).
Cuando cambia de vista para listviewwebpart throw UI, simplemente obtiene una copia de los campos de la vista seleccionada y la inserta en su vista oculta.

Todo lo que necesita es obtener esta vista por ID, agregar \ eliminar los campos necesarios y actualizar la vista. Algo como esto:

  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(); 

De acuerdo con los artículos, usted cann't Actualizar los ViewGuid para listviewwebpart.

1

He estado luchando con esto hoy también.

Por alguna extraña razón, el código que proporcionó funciona en algunos casos pero no en otros.

No he tenido tiempo de investigar más sobre eso, pero lo que puedo decir es que si está dispuesto a usar XsltListViewWebPart (que es el reemplazo de ListViewWebPart en SharePoint 2010), se deshará de este molesto "error".

Acabo de probar en mí mismo.

Espero que ayude!

1

que estaba recibiendo el mismo error 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) 

Desde SPList.GetView es un método público, lo probé en Powershell utilizando el GUID de mi nueva vista. Funcionó bien

Descubrí que el problema era el contexto. Creé mi vista justo antes de la asignación ViewGuid. Cuando me cambiaron la creación de mi vista exterior de la SPLimitedWebPartManager, el código se ejecutó sin errores:

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(); 
    } 
} 
Cuestiones relacionadas