1

我正在与希望有一个简单解决方案的东西进行斗争的第六个小时,所以我想我会在这里发帖。

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

列表定义功能,称为“自定义访问列表”,在 web.xml 范围内。

所以我的功能接收器激活了这个列表定义功能,具有 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["Custom Access List"]; 抛出“值不在预期范围内”的异常。- 尽管在“创建”站点菜单操作下的 UI 中已部署、可见和可用的列表模板,但无法在接收器代码中找到。

调试代码确认web.ListTemplates SPListTemplateCollection不包含此新“自定义访问列表”的条目,尽管 UI 另有建议。

这是奇怪的事情。抛出异常,但如果我然后重新运行代码,即重新激活 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["Custom Access List"]; 被发现。

但我更希望前一种方法起作用 - 在我的接收器代码中激活列表定义功能,然后找到它,以便随后可以创建列表的实例。

4

3 回答 3

1

安德鲁,

问题与内部异步事件和活动时间有关。正如您所说,如果您离开并回来,它会起作用 - 即异步事件已完成。您将 featureCollection.Add 视为同步方法。

如果您需要同时创建模板和列表实例,您真正应该做的是使用 XML 框架。

向具有列表模板的功能添加一个,或者为列表实例添加一个新功能并引用列表模板的 FeatureID。

安德鲁

于 2010-01-22T09:44:54.553 回答
0

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

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

于 2010-01-21T23:09:17.217 回答
-1

似乎尚未创建列表模板。您可以尝试做一个循环并等待被创建

        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();
                }
            }
        }
于 2010-01-22T14:13:58.300 回答