我已经为列表编写了一个自定义编辑表单,这意味着我失去了某些开箱即用的功能,例如附件,因为它是开箱即用表单的一部分。我实现表单的方式是通过使用以下方法编写自定义可视化web部件ASP.NET 和c#代码后面,然后在部署期间我隐藏EditForm中现有的编辑web部件。aspx页面,然后将我的web部件添加到其中。

我开发表单的方式是适当地分离关注点,其中我的表单真的对SharePoint一无所知,它只是将数据对象传递给datamanager对象,然后将数据写入SharePoint。

问题出现在我写的附件表单中。我发现 SPContext.Current.ListItem.Attachments 立即将文件包含在 FileUpload 回邮后控制。我不必为此编写任何代码-只需在控件中选择文件时触发回发即可。

在大多数情况下,我可以忽略这样一个事实,即发生这种情况并且一切正常,因为我从未实际更新列表项的该实例。但是在某些边缘情况下,例如上传一个已经存在同名附件的文件,表单甚至没有触及我的代码就会爆炸。

我还发现有一个 AttachmentsControlSPContext.Current.FormContext.FieldControlCollection 并在每个 Page_Init UserControl的事件根本没有帮助问题。

我希望我的表单在列表项的上下文中的原因是,所有开箱即用的工具栏/功能区/上下文菜单/等。仍然正确链接到表单。我可以从编辑表单重定向到带有我的web部件的上下文页面,但这似乎是hackish和不必要的(更不用说只是糟糕的编码)。

有没有人对为什么会发生这种行为以及我如何解决它有任何见解?对于任何列表表单来说,像这样自动劫持控件供自己使用似乎是非常糟糕的设计。我觉得SharePoint应该有自己的控制,只是离开ASP.NET 单独控制,但事实似乎并非如此。

有帮助吗?

解决方案

在标准列表表单上,如果多次添加了同名附件。如果将存储该项目,则表单将引发异常,即其中一个附件已多次添加,并阻止添加该项目。

在您的情况下,您会复盖此异常,这会导致在尝试存储列表项时没有附件可用。为了避免这种行为,您需要手动检查附件是否已添加多次,否则您将始终失败。

您需要删除默认的NewForm web部件,而不是隐藏它。然后将不会引发异常,您可以获取附件。

其他提示

如果将事件处理程序附加到itemAdding事件,它是否会在错误条件上触发?您可能可以使用它来运行一些自定义代码来处理事件,或者可能只是抑制系统系统错误消息并提供您自己的更好的代码。

许可以下: CC-BY-SA归因
scroll top