0

我遇到了与此处描述的完全相同的问题。不幸的是,因为我没有 50 分,但我无法对此发表评论,所以我必须创建一个新的重复问题。

我的意思是它不像其他人的问题那样“100% 完全正确”,因为对我来说问题存在于编辑表单上,我正在使用自定义表单和字段的组合。但是我根据这个站点上的人提出的建议 #2 在字段级别添加自定义保存事件处理程序。我还应该注意,当我创建一个没有任何自定义表单或内容类型的新文档库并直接使用我的自定义字段时,事件处理程序也不会触发。但是,如果我创建一个新的常规 SharePoint 列表并添加自定义字段,则 OnSaveHandler可以火!所以我不太清楚为什么它在文档库中不起作用,但它在列表中起作用,因为我的印象是自定义字段的美妙之处在于它们独立于其他所有内容运行。意思是,即使我用我的编辑表单或其他控件做了一些不正常的事情,因为我将我的自定义方法附加到我的自定义字段的 OnInit 方法中的SPContext.Current.FormContext.OnSaveHandler那么无论如何都应该触发!即使是第一次加载该字段时,我实际上也看到调试器中连接了该事件。在调试模式下,我在下面的“if”语句旁边有一个断点,它会命中该断点,这意味着当触发 FormContext.OnSaveHandler 时,我的方法应该触发。

protected override void OnInit(EventArgs e)
{
  base.OnInit(e);

  if ((SPContext.Current.FormContext.FormMode == SPControlMode.New) ||  (SPContext.Current.FormContext.FormMode == SPControlMode.Edit))
    SPContext.Current.FormContext.OnSaveHandler += new EventHandler(MyHandler);
}

有什么想法吗?建议?

谢谢!

更新#1:经过一些故障排除后,我能够推断出我的自定义字段中的 EventHandler 被触发但仅在常规列表不是文档库中使用时!在常规 SharePoint 列表中,不仅会触发 SPContext.Current.FormContext.OnSaveHandler,还会保存自定义字段中的值。

附带说明一下,当将数据保存回从 SPFieldText 继承的自定义字段时,该值(即 json 数据)在列表视图中显示为#VALUE!,我认为这有点奇怪。我的意思是它能够正确读取存储在字段中的 json 数据,因为它可以很好地显示在编辑表单中。但出于某种原因,SharePoint 只是将其显示为#VALUE!在列表视图中。

4

1 回答 1

0

因此,经过许多令人沮丧的小时后,在文档库中使用自定义字段时似乎出现了几个问题。

  1. 您不能以任何有意义的方式使用它们,并期望在使用自定义上传页面时保存数据。换句话说,如果您想创建自己的自定义上传页面,该页面将文件上传输入字段和浏览按钮与您自己的嵌入在 ListFieldIterator 中的自定义字段相结合,那么这些值将不会被保存。这是事实!原因是上传文件和创建初始 ListItem 以及生成它的 ID 值的操作异步发生关于 ListItem EventReceiver。那么这到底是什么意思呢?这意味着当您尝试访问存储在 ListItem 事件接收器中 ItemAdded 方法的 SPItemEventProperties 参数中的自定义字段中的值时,所有这些值都将为 null,因为当前 SPContext 完全不知道这些值的存在字段及其各自的值,因为与初始文档上传相关的所有事件都在不同的线程中执行......异步。相反,当自定义字段尝试将自己“保存”回新上传的文档时,SPField.ListItem 的文档 ID 仍设置为零,因为这些自定义字段......你猜对了,在不同的线程中执行而不是“同步” 与生成新文档 ID 的上传事件一起发生。尽管我已经阅读了有关此问题的一些不同解决方法,但它们似乎都不起作用,或者它们非常复杂或要求您放弃使用自定义字段,这并不是真正的解决方法,而是更多的是“认输”。一个建议是简单地更新 EventReceiver 的 Elements.xml 文件,只需添加一个“同步”条目以强制事件同步发生而不是异步发生。起初我认为这太容易了,太好了,不可能是真的。事实证明,我是对的。:) 或者它们非常复杂,或者要求您放弃使用自定义字段,这并不是真正的解决方法,而更像是“认输”。一个建议是简单地更新 EventReceiver 的 Elements.xml 文件,只需添加一个“同步”条目以强制事件同步发生而不是异步发生。起初我认为这太容易了,太好了,不可能是真的。事实证明,我是对的。:) 或者它们非常复杂,或者要求您放弃使用自定义字段,这并不是真正的解决方法,而更像是“认输”。一个建议是简单地更新 EventReceiver 的 Elements.xml 文件,只需添加一个“同步”条目以强制事件同步发生而不是异步发生。起初我认为这太容易了,太好了,不可能是真的。事实证明,我是对的。:)
  2. 您不能在自定义控件中嵌套自定义 ListFieldIterator 并期望自定义字段保存它们包含的数据。您必须直接在表单模板中使用 ListFieldIterator。时期!如果您尝试将 ListFieldIterator 与您的自定义字段包装在自定义控件中,您将对结果感到非常沮丧。

附带说明一下,一旦上传了文档并创建了 ID,您就可以在编辑表单中的自定义字段中输入数据,并且这些值被保存,因为现在您的代码实际上将能够引用 ListItem 的 ID 值因为 ListItem 已经存在于列表中。同样,这与自定义上传表单相反,其中 ListItem 的 ID 尚不存在,因为您尚未实际上传文档。

我真的希望 Microsoft 能够提供某种更新,让开发人员能够通过 Document Libraries 解决这个问题,而且我认为很明显,他们在首次发布 SharePoint 时就知道这是一个问题,这就是为什么文档库“新表单”是为用户提供一个独立的上传表单,然后将用户重定向到编辑表单,这样他们就可以避免所有这些。当然,这使得希望允许用户在同一屏幕上上传文档和输入数据的开发人员在使用自定义字段时没有立足之地。

于 2013-09-17T00:29:42.393 回答