我正在与希望有一个简单解决方案的东西进行斗争的第六个小时,所以我想我会在这里发帖。
我有一个带有功能接收器的功能,其唯一目的是激活已部署的列表定义功能,然后创建该新列表定义的实例。
列表定义功能,称为“自定义访问列表”,在 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"]; 被发现。
但我更希望前一种方法起作用 - 在我的接收器代码中激活列表定义功能,然后找到它,以便随后可以创建列表的实例。