我有一个自定义 SharePoint 应用程序页面部署到 _layouts 文件夹。它是自定义内容类型的自定义“新表单”。在与此页面交互期间,我需要将一个项目添加到我的列表中。当页面首次加载时,我可以使用 SPContext.Current.List 来查看我正在使用的当前列表。但是,在我填写表单并且表单回发到自身并且 IsPostBack 为 true 后,SPContext.Current.List 为 null,因此我找不到需要添加内容的列表。

这是预期的吗?

我应该如何在回发过程中保留有关上下文列表的一些信息?我是否应该使用列表的 guid 填充一些 asp:hidden 控件,然后在回发时将其拉回?我想这看起来很安全。

FWIW,这是 MOSS 2007 标准版本。

有帮助吗?

解决方案

一般来说,我会尝试复制产品组在添加我自己的功能时所采取的任何方法。在这种情况下,他们通过列表定义本身添加自己的编辑/查看/添加页面。

我构建了一个解决方案,它也需要自己的自定义“新”表单,不幸的是,它不是开源的,但如果您有兴趣,可以下载它,它称为“标记链接”(SharePoint 社交书签),您可以在我的网站上找到一些链接博客。

为了给您一些提示和技巧,以下内容应该让您朝着正确的方向前进:

  1. 创建了新的列表定义。
  2. 创建了新的内容类型 在内容类型中,您可以定义自己的“FormTemplates”,它引用渲染模板,该模板确定在这些表单的“中间”位中显示的内容。
  3. 复制了标准渲染模板,但随后对其进行了更改。
  4. 将其全部包装在一个解决方案中并进行部署。

我的渲染模板实际上包含一个被覆盖的“保存”按钮,我在保存过程中完成了许多额外的工作。

不管怎样,在我看来,这有点太多的工作,但我认为,它最符合产品开发人员所采用的标准方法。如果您需要更多详细信息,请告诉我,我会看看是否可以整理一篇分步博客文章,但希望这能让您走上正确的方向。

其他提示

如果您可以在 _Layouts 文件中执行一些在表单模板中无法执行的操作,我会感到惊讶。您可以使用几乎相同的技术。

查看 SharePoint 使用 ListItems 和布局页面的方式(例如列表项上的“管理权限”),我可以看到它们通过查询字符串传递一些变量:?obj={76113B3A-FABA-4389-BC85-4BB2CC5AB423},6,LISTITEM&列表={76113B3A-FABA-4389-BC85-4BB2CC5AB423}

也许他们每次都以编程方式使用这些值来获取上下文。

我没有使用自定义的“新表单”,因此这可能不适用。我向自定义内容类型添加了一个事件接收器,然后在 ItemAdded 或 ItemAdding 事件中执行自定义代码。当事件添加到列表时,将触发此代码。您可以使用事件接收器属性来访问父列表、Web 和站点。

我想我的问题在这里是“特殊的”,因为我使用的是自定义表单。我选择使用自定义表单而不是自定义 FormTemplate 只是因为我正在做很多不太像 SharePoint 列表的事情(进行 ajax 调用以从第三方应用程序获取信息,然后生成一些基于ajax 结果,然后在回发时对该数据进行后续处理)。我认为在通常的自定义渲染模板机制中尝试这个将是一场噩梦。

我也不认为我可以在列表定义本身中提供自定义表单声明,因为我有多个与此列表关联的内容类型,并且每个内容类型都有自己的自定义表单(幸运的是,其他类型要简单得多)。

实际上,我将列表 GUI 保留在隐藏字段中的简单方法是解决此特定问题的影响非常小的方法。我主要担心的是,我不确定为什么当我在这里回发时 SPContext 就失去了所有用处,这让我觉得我做错了什么。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top