我的SharePoint功能接收激活列表定义功能,但我的代码无法看到列表模板,直到“第二次”

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

我为我的第六个小时的奋力拼杀什么希望应该有一个简单的解决办法,所以我想我会在这里发布。

我有一个功能接收器,其唯一目的是激活已部署的列表定义特征,然后创建新的列表定义的实例的特征。

在列表定义功能,被称为“自定义访问列表”,在网络范围的。

因此,我的功能接收激活该列表定义的特征,具有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
}

此代码执行罚款,并列表定义功能被激活,并在新的列表定义出现在“创建”网站菜单中的UI选项。

不过,这是我的问题开始的地方。我的功能接收下一行代码,然后尝试创建这个新的可用列表的一个实例:

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

但是,线 SPListTemplate listTemplate = web.ListTemplates [“自定义访问列表”]; 投用一个异常“值没有落入预期范围之内。” - 列表模板,尽管被部署,可见和可在“创建”网站菜单操作下的UI,不能在接收器代码中找到

调试代码确认的 web.ListTemplates SPListTemplateCollection 的不包含这种新的“自定义访问列表”,一个条目尽管UI提示,否则。

这是奇怪的事情。则抛出异常,但如果我然后重新运行该代码,即重新激活用户界面中的特征,以重新执行该功能接收器,所述列表模板的然后结果 -

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

因此,概括地说 - 最初,激活一个功能,它通过接收器的代码,激活列表定义特征之后,该列表定义的可见,直到之后的“回发”或某种形式的“的SPWeb刷新”。 然后它是可见的。

我失去了一些东西在这里? )这里web.Update的呼叫(:

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

什么都不做。有一些方法可以让我“刷新” SPWeb对象,使新的列表模板可以看到和使用呢?

解决方法我已经找到了,现在,是添加了“自定义访问列表”列表模板功能为“父”功能接收器本身的激活依赖,并提出了“自定义访问列表”列表模板功能隐藏。这样一来,就我所知,自定义列表定义的功能被强制激活,我发现的 web.ListTemplates [“自定义访问列表”]; 的发现

但我宁愿前者的工作方法 - 激活,在我的接收器的代码,列表定义功能,然后找到它,这样的列表的一个实例然后可以创建

有帮助吗?

解决方案

安德鲁,

问题是与内部异步事件和活动的时间的事情。正如你说,如果你走开,回来它的工作原理 - 即异步事件已完成。您正在处理featureCollection.Add作为SYNCHRONUS方法。

你真正如果你需要一个模板,并在同一时间创建的列表实例是使用XML框架,这个应该做的。

添加到您的功能,有列表中的模板,或者添加新功能的列表实例并引用列表模板的FeatureID的。

安德鲁

其他提示

您需要调用EnsureListsData的SPListCollection你刚刚更新。

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

似乎列表模板尚未创建。你可以尝试做一个循环,待要创建

        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();
                }
            }
        }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top