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