Mein Sharepoint-Feature-Empfänger aktiviert eine Liste Definition Funktion, aber mein Code kann sehen, nicht die Listenvorlage bis zum „zweiten Durchgang“

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

Frage

Ich bin in meine sechste Stunde Battling mit dem, was hoffentlich eine einfache Lösung haben sollte, so dass ich dachte, ich würde hier posten.

Ich habe eine Funktion mit einem Feature-Empfänger, deren einziger Zweck es ist, eine bereitgestellte Liste Definition-Funktion zu aktivieren und dann eine Instanz der neuen Listendefinition erstellen.

Die Liste Definition Funktion "Custom Access List" genannt, wird im Web-scoped.

So ist meine Funktion Empfänger aktiviert diese Listendefinition Funktion, mit 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
}

Diese Code ausführt, in Ordnung, und die Listendefinition Funktion aktiviert ist, und die neue Listendefinition erscheint in der „Create“ site Menüoption in der Benutzeroberfläche.

Dies ist jedoch, wo mein Problem beginnt. Die nächste Zeile meiner Funktion Empfängercode dann versucht, eine Instanz dieser neu verfügbaren Liste zu erstellen:

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

Aber die Zeile SPListTemplate Listtemplate = web.ListTemplates [ "Custom Access List"]; löst eine Ausnahme mit "Wert nicht innerhalb des erwarteten Bereichs." -. Die Listenvorlage trotz eingesetzt werden, sichtbar und verfügbar in der Benutzeroberfläche unter „Create“ site Menü Aktion kann nicht in dem Empfängercode gefunden werden

Debuggen des Code bestätigt, dass die web.ListTemplates SPListTemplateCollection enthält keinen Eintrag für diese neue "Custom Access List", trotz der UI was darauf hindeutet, sonst.

Und hier ist die seltsame Sache. Eine Ausnahme wird geworfen, aber wenn ich dann den Code heißen Reaktivieren der Funktion in der Benutzeroberfläche erneut ausführen, um diese Funktion Empfänger erneut ausführen, um die Liste template gefunden wird, dann -

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

Also, auf dem Punkt gebracht - zunächst nach einer Funktion zu aktivieren, die durch Empfängercode, eine Feature-Liste Definition aktiviert, ist, dass Listendefinition nicht sichtbar, bis nach einem „Postbacks“ oder irgendeine Form von "SPWeb Refresh". Dann es ist sichtbar.

Bin ich hier fehlt etwas? Ein Aufruf von web.Update () hier:

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

tut nichts. Gibt es irgendeine Art und Weise kann ich „refresh“ das SPWeb Objekt so, dass die neue Listenvorlage gesehen und kann verwendet werden?

Die Abhilfe, die ich gefunden habe, denn jetzt ist die „Custom Access List“ Listenvorlage Funktion als Aktivierungs Abhängigkeit in dem „Eltern“ Feature-Empfänger selbst, hinzuzufügen und die „Custom Access List“ Listenvorlage-Funktion versteckt zu machen . Auf diese Weise meines Wissens wird die benutzerdefinierte Listendefinition Funktion gewaltsam aktiviert und ich finde, dass web.ListTemplates [ "Custom Access List"];. gefunden

Aber ich würde viel lieber die frühere Ansatz der Arbeit -. Activate in meinem Empfängercode, die Listendefinition Funktion und dann zu finden, so dass eine Instanz der Liste kann dann erstellt werden

War es hilfreich?

Lösung

Andrew,

Das Problem ist mit internen async Ereignissen und das Timing der Aktivität zu tun. wenn Sie, wie Sie sagen, gehen weg und kommen zurück, es funktioniert - das heißt, das asynchrone Ereignis abgeschlossen. Sie sind die featureCollection.Add als synchronus Verfahren behandelt werden.

Was Sie wirklich tun sollten, wenn Sie eine Vorlage und eine Liste Instanz müssen zur gleichen Zeit erstellt wird, um die XML-Framework für diese verwendet wird.

Fügen Sie ein auf Ihre Funktion, die die Listenvorlage hat, oder alternativ eine neue Funktion für die Liste Instanz hinzufügen und die FeatureID der Listenvorlage verweisen.

Andrew

Andere Tipps

Sie müssen EnsureListsData auf dem SPListCollection nennen, dass Sie gerade aktualisiert.

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

Es scheint, dass die Listenvorlage ist noch nicht erstellt. Sie können versuchen, eine Schleife zu tun und warten erstellt

werden
        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();
                }
            }
        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top