自定义应用程序页面中的SharePoint SPContext.List
我将一个自定义SharePoint应用程序页面部署到_layouts文件夹。这是自定义内容类型的自定义"新表单"。在与此页面进行交互期间,我需要将一个项目添加到我的列表中。首次加载页面时,我可以使用SPContext.Current.List查看正在使用的当前列表。但是,在我填写表单并将表单发回自身并且IsPostBack为true之后,SPContext.Current.List为null,所以我找不到需要添加内容的列表。
这是预期的吗?
我应该如何在回发期间保留有关上下文列表的一些信息?我是否应该使用列表的GUID填充一些asp:hidden控件,然后将其从回发列表中拉回?我想那似乎很安全。
FWIW,这是MOSS 2007 Standard版本。
解决方案
回答
我没有使用自定义的"新表格",因此这可能不适用。我将事件接收器添加到自定义内容类型中,然后在ItemAdded或者ItemAdding事件中执行自定义代码。将事件添加到列表时将触发此代码。我们可以使用事件接收器属性来访问父列表,网站和站点。
回答
一般而言,在尝试添加自己的功能时,我会尝试复制产品组采取的任何方法。在这种情况下,他们可以通过列表定义本身添加自己的编辑/查看/添加页面。
我构建了一个解决方案,该解决方案还需要自己的自定义"新"表单,而不是开放源代码,但是,如果我们有兴趣可以下载它,称为"标记链接"(SharePoint社会书签),并且可以在我的网站上找到一些链接博客。
为了给我们一些提示和技巧,以下内容应使我们朝着正确的方向出发:
- 创建一个新的列表定义。
- 创建新的内容类型在内容类型中,我们可以定义自己的" FormTemplates",该" FormTemplates"引用一个"渲染模板",该模板确定在这些表单的"中间"位中显示的内容。
- 复制了标准的"渲染模板",但随后进行了所需的更改。
- 将所有内容包装在解决方案中,然后进行部署。
我的渲染模板实际上包括一个覆盖的"保存"按钮,在该按钮中,我做了很多在保存过程中需要做的额外工作。
无论如何,我认为这是一件太多的工作,但是,我认为,它与产品开发人员所采用的标准方法最接近。如果我们需要更多详细信息,请告诉我,我将看看是否可以整理成一个逐步的博客文章,但希望这可以使我们朝正确的方向前进。
回答
我想认为我的问题在这里是"特殊"的,因为我使用的是自定义表单。我选择使用自定义表单而不是自定义FormTemplate仅仅是因为我正在做很多不很像SharePoint列表的工作(进行ajax调用以从第三方应用程序获取信息,然后基于以下内容生成一些动态表单元素)该ajax结果,然后在回发时对该数据进行后续处理)。我认为在常规的自定义渲染模板机制中尝试此操作将是一场噩梦。
我也不认为我可以在列表定义本身中提供自定义表单声明,因为我有与此列表关联的多种内容类型,并且每种内容类型都有自己的自定义表单(值得庆幸的是,另一种类型更简单)。
实际上,我将列表guid保留在我的隐藏字段中的简单方法是解决此特定问题的影响很小的方法。我主要担心的是,我不确定为什么当我在此处发回邮件时,SPContext会失去所有的用处,这使我觉得我做错了什么。
回答
如果我们可以在_Layouts文件中执行某些无法在表单模板中执行的操作,我会感到惊讶。我们可以使用几乎相同的技术。
查看SharePoint与ListItems和Layouts页面的工作方式(例如,列表项上的" Manage Permissions"),可以看到它们通过querystrings传递了一些变量:
?obj = {76113B3A-FABA-4389-BC85-4BB2CC5AB423},6,LISTITEM&List = {76113B3A-FABA-4389-BC85-4BB2CC5AB423}
也许他们每次都使用这些值以编程方式获取上下文。