1

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

这是预期的吗?

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

FWIW,这是 MOSS 2007 标准版。

4

4 回答 4

2

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

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

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

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

我的渲染模板实际上包括一个被覆盖的“保存”按钮,我在其中做了很多我在保存期间需要做的额外工作。

无论如何,在我看来,这有点太多工作了,但我认为,它最接近产品开发人员采用的标准方法。如果您需要更多详细信息,请告诉我,我会看看我是否可以整理一篇循序渐进的博客文章,但希望这能让您走上正确的方向。

于 2008-08-27T17:30:42.720 回答
2

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

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

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

于 2008-08-27T18:36:09.427 回答
0

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

于 2008-08-27T13:52:34.010 回答
0

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

我也不认为我可以在列表定义本身中提供自定义表单声明,因为我有多种与此列表关联的内容类型,并且每种内容类型都有自己的自定义表单(谢天谢地,另一种类型要简单得多)。

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

于 2008-08-27T17:52:19.160 回答