分类存档: SharePoint 发展

简单的解释: “值并不属于在预期的范围。”

更新: 匿名的海报留下伟大的评论关于内部名称. 一定要阅读它.

使用事件接收器和其他代码引用的对象模型通过 SharePoint 列表项时, 我常常想生成此错误在运行时的错误:

加载时出错,并在 xyzzy 中运行事件接收器 Conchango.xyzzyEventReceiver, 版本 = 1.0.0.0, 文化 = 中性, 公钥 = 0dc50a750396c3ac. 附加信息是下面. : 值不在预期的范围内.

这是一个相当通用的错误,可能造成许多不同的方式. 不过, 一个简单的解释是,我错误地引用字段. 如果字段的名称是"到期日", 我必须在事件接收器中引用此类:

属性。ListItem["到期日"]

当我出现拼写错误或使用错误的大小写,引用该字段时, SharePoint 生成上述提到的运行时错误. 例如, 这是错误的:

属性。ListItem["到期日"]

</结束>

订阅我的博客.

Technorati 标签:

快速 & 容易: 创建一个文件夹,并将分配一个内容类型 (或, 有你的 Kpi,它们也吃)

为了变通 KPI 问题 我写了关于这里, 我做了一些测试,发现该 KPI 工作对 meta 数据的文件夹相同的方式,他们工作对文件或列表项目. 我证明了通过创建新的内容类型基于文件夹内容类型,然后添加几个字段. 我创建了一些指标和证明自己 Kpi 按预期方式工作. 这是一个好消息. 它并不完美, 因为向下钻取你从 KPI 对文件夹不是你想要什么. 这不是在我的例子太多缺点因为 1) 最终用户不知道任何更好和 2) 向下钻取转到文件夹. 他们单击文件夹名称和他们处于项目. 它是一个两次点击, 这不是世界末日.

这很好地流的是我正在做的工作. 我创建了一个文件夹获取上传的每个文档. 这是通过事件接收器. 结果, 它是一块蛋糕要保持 父文件夹 元数据同步与 KPI 驱动元数据从文件本身因为水管已到位. This allows me to have my KPI’s and eat them too 🙂

我修改事件接收器添加该文件夹,然后将这个新文件夹中的内容类型设置为我自定义 KPI 友好内容类型. 这段代码是成功的关键:

 SPFolderCollection srcFolders = targetWeb.GetFolder("文档").子文件夹;
  SPFolder addedFolder = srcFolders.Add(属性。ListItem.ID.ToString());
  SPContentTypeId kpiCT = 新增功能 SPContentTypeId("0x0120002A666CAA9176DC4AA8CBAA9DC6B4039F");
  addedFolder.Item["内容类型 ID"] kpiCT =;
  addedFolder.Item.Update();

若要查找实际的内容类型 ID, 我访问通过网站设置该内容类型和复制/粘贴它从如图所示的 URL:

图像

</结束>

订阅我的博客!

Technorati 标签: ,

快速、 方便: 事件接收器中获得 SPListItem 的 SPFolder

我不愿承认这一点, 但这一所有困扰了我一天. 我的事件接收器需要更新其父文件夹的字段. 这一点点演示如何做它:

私人 无效 UpdateParentFolder(SPItemEventProperties 属性)
{

SPFolder thisItemFolder = 属性。ListItem.File.ParentFolder;
thisItemFolder.Item["ZZ 审批状态"] = "好消息, 每个人都!";
thisItemFolder.Item.Update();


} // UpdateParentFolder

在此情况下, 我正在与文档库和属性来自 ItemAdded 的事件.

问题在于你不该项目的 SPFolder 直接从项目本身 (e 小节. 属性。ListItem.Folder 为空). 相反, 转到列表项关联的文件,并获取该文件的文件夹.

</结束>

订阅我的博客!

Technorati 标签:

另一个事件接收器尚未调试技巧

我确信我不是第一次的人来了. 不过, 我没注意到有人开始密切关注社区去年 7 月发布这样的小把戏. 所以, 我以为我会寄此快速而轻松地调试提示.

我的工作,开始生成此错误的事件接收器 12 配置单元:

加载时出错,并在 xyzzy 中运行事件接收器 Conchango.xyzzyEventReceiver, 版本 = 1.0.0.0, 文化 = 中性, 公钥 = blahbalhbalh. 附加信息是下面. : 未设置到对象的实例的对象引用.

我不知道在哪里我曾经引进了这个 bug,因为我做了太多的事情,在我的代码,部署,测试周期之一.

我试着 此解决方案 想我 pdb 抱着希望,SharePoint 12 配置单元会显示堆栈跟踪, 但运气不好. 我不知道如果有可能,如果有人做了, 请让我知道 🙂

我知道这是可能的 将您自己日志消息写入 12 配置单元. 坦白地说, 我想要的东西稍少一些可怕的和更快地实现.

我想到我至少能让一些基本的跟踪信息的捕捉和再次引发像这样的泛型异常:

  请尝试 {
    UpdateEditionDate(属性);
  }
  赶上 (异常 e)
  {
    抛出 新增功能 异常("调度员, UpdateEditionDate(): 异常: [" + e.ToString() + "].");
  }

这显示在 12 这上面配置单元:

加载时出错,并在 xyzzy 中运行事件接收器 Conchango.xyzzyEventReceiver, 版本 = 1.0.0.0, 文化 = 中性, 公钥 = 特立. 附加信息是下面. : 调度程序, UpdateEditionDate(): 异常: [System.NullReferenceException: 未设置到对象的实例的对象引用. 在 Conchango.xyzzyManagementEventReceiver.UpdateEditionDate(SPItemEventProperties 属性) 在 Conchango.xyzzyManagementEventReceiver.Dispatcher(SPItemEventProperties 属性, 字符串 eventDescription)].

这给了我追踪这一具体问题所需的所有细节,我希望使用它很多前进.

</结束>

订阅我的博客!

解决方案: SPQuery 不能搜索文件夹

过去这周我正在实施"演变" 使用 BDC 和 SPQuery 并遇到一些困难,使用 SPQuery 针对包含文件夹的文档库的客户端解决方案. 底线: 分配"递归" 在视图属性中的查询.

我的方案:

  • 周一, 上传文档,并提供一些元数据.
  • 下一周, 我上传一个新的文档. 很多此新文档的元数据基于我周一传的文档 (我们称之为"主文档").
  • 我们已经创建了 web 服务门面提供 BDC-友好界面到列表中,以便用户可以方便地找到那星期一通过搜索标题的文档.
  • BDC 数据列提供了一个友好的用户界面. (这是企图的我在为一个更友好的查阅列使用 BDC 的一部分).

最后的 BDC 门面服务使用像这样的查询进行查找:

 // U2U 工具用于生成此 CAML 查询帮助.
      oQuery.Query =
        "<在哪里>";

      如果 (titleFilter.Length > 0)
        oQuery.Query   =
          "  <和>";

      oQuery.Query   =
        "    <和>" +
        "      <Geq>" +
        "        <FieldRef 名称 = "DocumentId" />" +
        "        <值类型 = "Text">" + minId + "</价值>" +
        "      </Geq>" +
        "      <Leq>" +
        "        <FieldRef 名称 = "DocumentId" />" +
        "        <值类型 = "Text">" + maxId + "</价值>" +
        "      </Leq>" +
        "    </和>";

      如果 (titleFilter.Length > 0)
        oQuery.Query   =
          "    <包含>" +
          "      <FieldRef 名称 = "Title" />" +
          "      <值类型 = "Text">" + titleFilter + "</价值>" +
          "    </包含>" +
          "  </和>";
      oQuery.Query   =
        "</在哪里>";

在发展的初始阶段, 这工作得非常棒. 不过, 我们引入的目录来解决一些问题的文件夹和突然, 我 BDC 选取器不会返回任何结果. 我跟踪这 SPQuery 将永远不会返回任何结果的事实. 我们文件夹主要用于允许多个文件具有相同的名称,要上载,但使用不同的元数据. 当上载文件, 我们创建一个基于 ID 的列表项的文件夹,然后移动该文件存在 (写了, 在这里; 我们已经 好坏参半的结果 这种方法,但整体上, 它好工作). 用户不关心文件夹,事实上, 真不明白有任何文件夹. 我们已经配置上要显示的项目而不考虑文件夹的库的所有视图.

我打了两倍的技术实施发展和解决它以不同的方式每次这个问题. 第一次, 我不在查询中使用包含运算符. 没有包含运算符, 我是能够解决的问题通过指定视图上 SPQuery 的构造函数. 而不是使用默认的构造函数:

写入 oList = web。列表["文档"];

SPQuery oQuery = 新增功能 SPQuery();

我转而用于指定视图的构造函数:

写入 oList = web。列表["文档"];

SPQuery oQuery = 新增功能 SPQuery(oList.Views["所有的文档"]);

这解决了这个问题,我开始我的结果.

然后加入混合的 CONTAINS 操作符,它再一次打破了. 原来,包含运算符, 到目前为止,我可以告诉, 不能与视图相同的方式更简单的 GEQ / LEQ 运算符. 我做了一些搜索,学到了,该查询 ViewAttributes 应该设置为"递归", 如在:

oQuery.ViewAttributes = "范围 = "Recursive"";

包含用于解决了这个问题. 事实上, 这也解决了我原来的搜索问题和如果指定递归属性第一次, 我会不有问题再碰到.

基于视图的 SPQuery 工程部分经营者这一事实 (GEQ/LEQ) 而不是其他 (包含), 加上这一事实似乎 Kpi 不能工作在所有与此文件夹包含的文档库主角我相信 SPQuery 具有正交性的几个问题.

特别感谢:

  • 在的好人们 U2U 和他们的查询工具.
  • 迈克尔 · 哈弗的伟大 "边学边做" 博客张贴内容, 意见及回应.

</结束>

订阅我的博客!

MOSS KPI 的 bug? 绑定到文档库的文件夹的列表指示器

更新 02/29/08: 这解决了创建一个文件夹,然后将内容类型分配给有需要用于 Kpi 的 meta 数据的文件夹. 我在这里的一个小更详细的描述,.

我们已实施技术解决方案,用户将文档上载到文档库. 事件接收器创建目录,并将文件移到该目录 (使用类似于我写了有关的技术 在这里). 我们已经成功地驶过致重命名上传的文件的事件接收器的潜在问题 (主要是因为用户通过单击"新建从来没有开始他们的文档" 但而创建的文档本地,然后将它们上载).

这些文件的元数据包括 Yes/没有站点列称为"紧急" 和另一个网站栏名为"状态". 我们需要显示的百分比"紧急的业务要求" 其状态为"挂起"的文件.

这是通常简单的事 和描述了这种事非常在 SharePoint 比格犬 有很多的如果你感兴趣的屏幕截图.

简而言之, 我做了以下:

  • 上称为"挂起"的文档库创建视图.
  • 配置要忽略文件夹结构的视图.
  • 创建 KPI 列表.
  • 创建指标,在列表中,指向 doc lib 和那"挂起" 视图.

这是完全行不通. KPI 显示我的目标 (例如:. 五个紧急文件) 但总是显示紧急文件为零的实际数. 矛盾的是, 如果你深入查看详细信息, 它显示列表中的五个紧急文件. 我与两个文档创建一个非常简单的场景, 一个在一个文件夹和一个不. 这里是屏幕截图:

图像

上面的屏幕快照清楚地显示有两个文件中的视图,但"价值" 是一种. "CamlSchema" 空白的文档 Id 是的根文件夹中,另一种是在一个名为"84"文件夹中.

依我看来,即使您指定的视图, KPI 不理会"显示所有项目没有文件夹" 设置和改为, 局限到根文件夹.

如果我错了, 请放我一条线或留下评论.

</结束>

订阅我的博客!

Technorati 标签:

解决问题的办法: “FileNotFoundException” 与我功能接收机.

我正在研究一种功能上个星期,会将一些事件接收器添加到特定列表实例. (我有点博文在这里该列表接收机).

使用命令行, 我无法安装功能,并没有错误 (但请参阅下面的隐藏错误). 当我试图部署上该网站的功能, MOSS 抱怨"FileNotFoundException" 错误. 此博客条目描述怎么解决的.

这是一个 MOSS 表明我在 web 浏览器中的错误:

功能 ' b2cb42e3-4f0a-4380-aaba-1ef9cd526f20’ 不安装,因为加载的事件接收器大会"xyzzyFeatureReceiver_0" 失败: System.IO.FileNotFoundException: 未能加载文件或程序集 xyzzyFeatureReceiver_0’ 或一个依赖项. 系统无法找到指定的文件.
文件名称: ' xyzzyFeatureReceiver_0’
在 System.Reflection.Assembly.nLoad(进行校验文件名, 字符串代码库, 证据 assemblySecurity, 大会 locationHint, StackCrawlMark& stackMark, 布尔 throwOnFileNotFound, 布尔 forIntrospection)
在 System.Reflection.Assembly.InternalLoad(进行校验 assemblyRef, 证据 assemblySecurity, StackCrawlMark& stackMark, 布尔 forIntrospection)
在 System.Reflection.Assembly.InternalLoad(字符串 assemblyString, 证据 assemblySecurity, StackCrawlMark& stackMark, 布尔 forIntrospection)
在 System.Reflection.Assembly.Load(字符串 assemblyString)
在 Microsoft.SharePoint.Administration.SPFeatureDefinition.get_ReceiverObject()
警告: 程序集绑定日志记录打开关闭.
要启用程序集绑定失败日志记录, 设置注册表值 [HKLMSoftwareMicrosoftFusion!EnableLog] (DWORD 值) 自 1.
请注意: 有一些与程序集绑定失败日志记录相关联的性能.
若要关闭此功能, 删除注册表值 [HKLMSoftwareMicrosoftFusion!EnableLog].

与 Windows SharePoint 服务问题的疑难解答.

我知道如何去故意导致该错误: 不在 gac 中安装程序集. 但, 它是在 gac 中. 我通常将程序集安装到 gac 中通过将它们拖入 c:\使用 windows 资源管理器的 windowsassembly 文件夹. 我从来 100% 舒适这样做,因为我总是以为那 gacutil 存在的原因 … 所以我试过了. 它没有区别.

互联网中搜索的结果,并找到这篇帖子: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2243677&SiteID=1

海报碰巧使用同一根位的代码 (从内部 WSS 书从该列表中) 所以这是一个充满希望的迹象. 不过, 装饰与大会的建议 [程序集: ] 指令对我没有意义. 不管怎样,我还是把它尝试,右. 它没有区别.

然后我注意到我的类定义是不公开. 我将它公开并无差异.

下一步, 我去了启用"程序集绑定失败日志的麻烦" (提供的帮助和最准确的说明) 这是在哪里,事情开始变得有趣. 该日志显示我运行时到处搜索,该服务器上为我的程序集. 它甚至似乎在寻找它在我的药柜. 但 … 它不会在 GAC 中搜索它.

我穿上我冬季夹克和去再次搜索互联网,发现有人也有这问题. 在这个帖子中的冗长讨论彼得斯掉到什么和我找不到解决方案.

我将我的程序集移动到日志声称它搜索并多一点进步的地方之一. 一个新的错误,在浏览器中尝试激活该功能时我得到现在工作:

未能从程序集"xyzzyFeatureReceiver_0"创建功能接收器对象, 键入"Conchango.xyzzyFeatureReceiver" 为功能 b2cb42e3-4f0a-4380-aaba-1ef9cd526f20: System.ArgumentNullException: 值不能为空.
参数名称: 类型
在 System.Activator.CreateInstance(类型类型, 布尔非公开)
在 System.Activator.CreateInstance(类型类型)
在 Microsoft.SharePoint.Administration.SPFeatureDefinition.get_ReceiverObject()

与 Windows SharePoint 服务问题的疑难解答.

一个最后一次去互联网的时间!

这一次找出, 不出所料, 苔藓发出此错误,因为程序集不是 GAC 中.

我想要得到的东西正从这并尝试感到有点骄傲的了 Fugitive MSIL 程序集, 但它不工作. 我只是平原恼火. 我发现自己喃喃自语"鸡还是先有蛋" 根据我的呼吸.

我最后决定平底船. 我创建一个完全新的项目和复制/粘贴到这个新项目从 incredible-cloaked-from-the-GAC-assembly 非工作项目在代码. (我寻找称为"隐藏从程序集绑定如果安装到 GAC 中像一个生成标志" 但找不到一个).

安装功能,并将其激活, … 它的工作原理! 所以, 所有这一切之后, 我基本上已经到 ' 重新启动’ 我的项目. 这是为什么我讨厌的计算机的另一个原因.

我确实学到一些有用的这. 以前安装过整天都使用 stsadm 命令行功能和已使用"-力" 出于习惯选项. 因为某些原因, 我没有使用-force 选项,当你安装了新的项目. 这一次, 我做的其实, 真正忘了将这个新项目的程序集复制到 gac 中. 结果, 我收到了"FielNotFoundException" 错误. 这一次, 得从 stsadm, 没有,当我试着激活通过 web 浏览器功能. 所以, -力事实上是扮演两个角色. 它允许您重新安装现有的功能. 它还允许您将不能工作在运行时通过抑制错误越野功能安装. 它可能表示尽可能帮助地方但永远不会注意到了它.

</结束>

Technorati 标签: ,

快速 & 容易: 重命名已上载的文件使用 SharePoint 对象模型通过事件接收器

更新: 这工作,但有很大的局限性,介绍了在评论中. 这可能仍然是有用的一些基本状况.

更新 2: 我当前的项目中, 用户始终上载文件. 结果, 不会遇到一个问题 MS Word 正在运行,并且认为它重命名该文件. 我也遇到一个问题, "文件的修改由其他人" 并解决了这个问题通过一个简单的信号类型标志. 用户需要从其默认值的元数据字段更改为别的东西. Itemupdated() 寻找有效的值实际上执行重命名之前并自那时以来接收器, 我没有任何问题. 您的里程可能会发生变化.

我有一个客户端要求更改上载到以符合特定的命名约定的特定文档库的文件名称. 该 API 并不提供"重命名()" 方法. 相反, 我们使用 "MoveTo(…)". 这里是代码的最少来完成这位:

 公众 重写 无效 ItemAdded(SPItemEventProperties 属性)
        {
            SPFile f = 属性。ListItem.File;

            f.MoveTo(属性。ListItem.ParentList.RootFolder.Url + "/xyzzy.doc");
            f.Update();

        }

唯一麻烦的地方是"属性。"ListItem.ParentList.RootFolder.Url. MoveTo() 方法需要一个 URL. 那捣碎的字符串点我到我当前的文档库的根文件夹中. 这让我们避免任何硬编码在我事件接收器.

这是一个更有用的版本,做同样的事, 但分配的文件的名称为"标题":

 公众 重写 无效 ItemAdded(SPItemEventProperties 属性)
        {
            DisableEventFiring();

            // 将此项的标题分配给文件本身的名称.
 // 请注意: 这项任务必须发生之前我们修改文件本身.
 // 调用 update() 对 SPFile 似乎要使之无效的属性中
 // 某种意义上.  "标题的更新" 失败之前,更改 (和更新() 电话)
 // 在更改前被移到的文件的名称.
            属性。ListItem["标题"] = 属性。ListItem.File.Name;

            属性。ListItem.Update();

            SPFile f = 属性。ListItem.File;

            // 获取该文件的扩展名.  我们以后需要的.
 字符串 spfileExt = 新增功能 FileInfo(f.Name).扩展;

            // 重命名的文件到列表项 ID 和使用的文件扩展名来保存
 // 它不变的那一部分.
            f.MoveTo(属性。ListItem.ParentList.RootFolder.Url +
                "/" + 属性。ListItem["ID"] + spfileExt);

            // 犯下移动.
            f.Update();

            EnableEventFiring();
        }

小提示: 内容查询 Web 部件, 查阅列的值和 XSL

我在一个名为"房地产所在地"的内容类型的列的名称.

该列的类型"查找".

我已修改 <CommonViewFields> 和 ItemStyle.xsl,若要显示的列.

一个简单的 <xsl:值的选择 =…> 回返回包含序号位置数据的内部值, 例如,:

1;#迈阿密

要获取的人性价值, 使用 xsl 之后的字符串, 如图所示:

<xsl:选择 valuexsl ="子串之后(@Real_x005F_x0020_Estate_x005F_x0020_Location,’#’)"></xsl:值的>

使用此技术,每当您正在使用的 XSL 转换中查找值,需要获取人性的价值.

<结束 />

Technorati 标签: , ,

快速、 方便: 确定网站列的内部列名称

更新: 杰里米 · 萨 关于这个话题的博客和贴一些 控制台应用程序的代码 这表明内部名称.

试图内容查询 web 部件来显示从任务的到期日期,因为屏幕的标签是"到期日期", 我以为,要在使用的列名称 <CommonViewFields> 是"Due_x0020_Date".

错了!

"DueDate"是在这种情况下真正的列名称.

我怎样找到它? 我重新读希瑟 所罗门的博客条目上修改 CQWP 要显示的数据的附加列. 她描述了这一步的过程 #13. 相信它. 它是正确. 至少, 它是正确的对我来说. 我不相信它在第一次多长的名称与另一列.

我说"信任它" 因为我不相信它,可能浪费了附近撞我的头靠墙的两个小时. 我解决"调度后" 名称, 我想要添加到另一个字段 <CommonViewFields>. 使用所罗门技术, 我越来越像"XYZ_x0020_Project_x0020_Due_x00"的列名称.

我心想, 这显然是截断的名称. 我去前方,未截断它,但没有成功. 我最后用看似截断的名称和它的工作.

特别提示: 当正在与 CQWP, 如果添加了一个坏的内部名称与 <CommonViewFields>, CQWP 会告诉我,该查询返回没有结果. 但, 如果字段名称中添加一个数据类型, 它将返回一个结果. 添加数据类型实际上掩盖的问题因为我引用一个不存在的字段. 我可以把它, 但当我想要显示其值, 我总是会一片空白.

这不掩盖错误:

<CommonViewFields>Due_x0020_Date;</CommonViewfields>

这并未掩盖错误:

<CommonViewFields>Due_x0020_Date,日期时间;</CommonViewfields>

</结束>