Mi característica de SharePoint receptor activa una lista de definición de la función, pero mi código no puede ver la lista de la plantilla hasta el "segundo paso"

StackOverflow https://stackoverflow.com/questions/2112350

Pregunta

Estoy en mi sexta hora luchando con lo que esperemos que debe tener una solución simple, así que pensé que iba a publicar aquí.

Tengo una función con una función de receptor, cuyo único propósito es activar un desplegado de la lista de definición de la función y, a continuación, cree una instancia de la nueva definición de la lista.

La definición de la lista de la característica, llamada "Custom Lista de Acceso", es el ámbito en el web.

Así que mi función de receptor se activa esta lista de definición de la función, tener GUID "1E503BDA-803B-4a1a-A042-019FA1A70C4C":

...
string featureGuid = "1E503BDA-803B-4a1a-A042-019FA1A70C4C";        // my 'Custom     try
{
    SPFeatureCollection featureCollection = web.Features;
    featureCollection.Add(new Guid(featureGUID), true); // activat the 'Custom Access List' feature
}
catch (Exception e)
{
    // log exception
}

Este código se ejecuta correctamente, y la definición de la lista está activada la función, y la nueva definición de la lista que aparece en "Crear sitio" opción de menú en la interfaz de usuario.

Sin embargo, aquí es donde mi problema comienza.La siguiente línea de mi función de receptor de código, a continuación, intenta crear una instancia de esta nueva lista disponible:

SPListTemplate listTemplate = web.ListTemplates["Custom Access List"];            // exception! Value does not fall within the expected range
web.Lists.Add("My new custom access list","", listTemplate);

Pero la línea SPListTemplate listTemplate = web.ListTemplates["Personalizado De La Lista De Acceso"]; lanza una excepción con "Valor no se encuentra dentro del rango esperado." - la plantilla de la lista, a pesar de ser implementado, visible y disponible en la interfaz de usuario, en el "Crear" menú del sitio de acción, no se puede encontrar en el código del receptor.

La depuración del código, se confirma que el web.ListTemplates SPListTemplateCollection no contiene una entrada para este nuevo "Personalizado de la Lista de Acceso", a pesar de la interfaz de usuario lo que sugiere lo contrario.

Y aquí está la cosa extraña.Se produce una excepción, pero si a continuación, vuelva a ejecutar el código, es decir,reactivar la característica de la interfaz de usuario, para volver a ejecutar esa función de receptor, la plantilla de la lista entonces se encuentra -

SPListTemplate listTemplate = web.ListTemplates["Custom Access List"];            // found this time. It sees it the second time around
web.Lists.Add("My new custom access list","", listTemplate);      // works fine

Así, en una palabra - inicialmente, después de la activación de una función que, a través del código del receptor, se activa una lista de definición de la función, que la definición de la lista es no visible hasta después de una "devolución" o alguna forma de "SPWeb actualizar". Entonces es visible.

Me estoy perdiendo algo aquí?Una llamada de la web.Update() aquí:

try
{
    SPFeatureCollection featureCollection = web.Features;
    featureCollection.Add(new Guid(featureGUID), true); // true to force activation
    web.Update();
}
...

no hace nada.Hay alguna manera en la que puedo "actualizar" el objeto SPWeb, de modo que la nueva plantilla de lista puede ser visto y utilizado?

La solución que he encontrado, por ahora, es para agregar el "Acceso Personalizado de la Lista" lista de las características de la plantilla como una activación de la dependencia en el "padre" de la función de receptor de sí mismo, y para hacer el "Acceso Personalizado de la Lista" lista de las características de la plantilla oculto.De esa manera, a mi conocimiento, la costumbre de la lista de definición de la función es la fuerza activa y me encuentro con que web.ListTemplates["Personalizado De La Lista De Acceso"]; se encuentra.

Pero me gustaría mucho más que el antiguo enfoque en el trabajo - para activar, en mi receptor, código, la definición de la lista de la característica y, a continuación, para encontrar de manera que una instancia de la lista puede ser creado.

¿Fue útil?

Solución

Andrew,

El problema tiene que ver con la interna asíncrona de eventos y el momento de la actividad.Como dices si desaparece y reaparece funciona - es decir,el async evento se ha completado.Usted está tratando el featureCollection.Añadir un synchronus método.

Lo que realmente debe hacer si necesita una plantilla y una lista de instancia creada al mismo tiempo es el uso de la plataforma XML para esto.

Agregar una a su función que tiene la plantilla de la lista, o, alternativamente, agregar una nueva característica para la lista de ejemplo y referencia de la FeatureID de la plantilla de la lista.

Andrew

Otros consejos

Usted necesita llamar a EnsureListsData en el SPListCollection que acaba de actualizar.

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splistcollection.ensurelistsdata.aspx

Parece que la plantilla de la lista aún no está creado.Usted puede tratar de hacer un bucle de espera para ser creado

        using(SPWeb web = site.OpenWeb())
        {
            SPListTemplate listTemplate = null;
            while (listTemplate == null)
            {
                Thread.Sleep(1000);
                try
                {
                    listTemplate = web.ListTemplates["Custom Access List"];
                    if (listTemplate != null)
                    {
                        // here your code 
                        web.Lists.Add("My new custom access list", "", listTemplate);
                    }
                }
                catch
                {
                    web = site.OpenWeb();
                }
            }
        }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top