2007年3月2日,星期五

使用VSeWSS创建列表

这是本系列的第一篇文章,旨在说明使用SharePoint功能创建MOSS网站的过程。有关完整系列的内容,请参见 我的介绍.

在这里,我们将研究创建SharePoint列表。对于SharePoint如此简单和核心的内容,很难将它们创建为功能。幸运的是,用于WSS的Visual Studio扩展极大地简化了该过程。如果您还没有遇到这种情况,我建议您尝试一下-WseWSS对于某些SharePoint开发方案基本上是一个巨大的帮助。以下文章是有良好背景的:

简而言之,在VSeWSS中创建列表的过程如下:

  1. 创建一个空白的Visual Studio项目。 N.B.如果您实际上是在创建SharePoint网站定义,则应选择“团队网站定义”或“空白网站定义”,因为WSeWSS将为您设置配置代码,该代码将在从该定义创建网站时执行。

  2. 在“项目”菜单上选择“添加新项”,然后从“ SharePoint”部分中选择“列表定义”。

  3. 通常,您应该从下拉列表中选择“自定义列表”作为基本列表定义。如果您实际上是在扩展该列表类型并希望保留原始的列,请仅选择其他选择。假设除了列表模板之外,您还想创建实际的列表(稍后将对此进行详细介绍),请选中“创建此列表的实例”框。另请注意“使用事件接收器添加”选项-这将设置可用于处理列表中事件的代码,例如,在添加/编辑/删除列表项时。



  4. 在对话框中单击“确定”后,适当命名您的列表。我的建议是避免空格或其他可能在某处编码的字符-该列表将具有一个显示名称,您可以自由使用它。

    WSeWSS现在已经在VS项目中创建了几个文件。




    我们可以看到以下内容:


    • 一些aspx文件,用户将用来处理列表的页面。请注意,如果您想偏离标准行为,可以对它们进行自定义。

    • 实例.xml-这是要编辑以将初始数据添加到列表中的文件。由于此文件会自动链接到适当的架构,因此编辑起来非常简单,因为VS会在您键入时告诉您有效的节点(如下所示)。

    • 两个.cs文件,其中包含事件处理程序的方法存根。这些已经准备好,您可以执行了。

    • schema.xml-它包含CAML,它指示列表存储哪些内容类型,任何自定义视图,还引用了我们提到的.aspx文件
  5. 如果要将默认项添加到列表中(如果创建了它的实例,则可能要这样做),则可以编辑instance.xml文件。这很简单,因为VSeWSS已将instance.xml连接到适当的XML模式(C:\ Program Files \ Common Files \ Microsoft Shared \ Web服务器扩展\ 12 \ TEMPLATE \ XML \ wss.xsd),然后您可以VS的Intellisense的优势,该优势是在您键入时从架构推断的:



  6. 进行任何自定义(例如,编辑instance.xml以添加列表项)后,转到VS项目的属性并检查“ SharePoint解决方案”选项卡。在这里,您将看到VSeWSS为每个列表生成了两个功能。一个用于列表实例,另一个用于列表模板。用户可以使用它使用您定义的列在网站上创建新列表。

  7. 转到项目属性上的“调试”选项卡,然后输入SharePoint开发站点的URL。解决方案将部署到此URL,因此输入此值很重要。

  8. 按F5键,WSeWSS将创建并部署解决方案。请注意,.wsp文件是在项目的bin \ Debug或bin \ Release目录中生成的。密切注意左下方的VS状态栏,以监视进度。如果部署成功,您的列表现在应该在“调试”选项卡上指定的站点中可见。


对于手工创建SharePoint解决方案/功能的任何人,VSeWSS都提供了一种引人注目的替代方案。不要弄乱ddf文件和makecab.exe,只需按F5键即可。但是,有一些烦恼:

  • 由于VSeWSS在每次部署时都会重写feature.xml文件,因此无法自定义此文件以添加无法在项目属性的“ SharePoint Solutions”区域中输入的内容。主要的示例是功能接收器类,用于指定在激活/停用功能时应该运行的代码(如果您想在此处执行某些操作)。当然,您可以在开发周期结束时编辑文件,但是您知道该死的总是会有进一步的调整,然后将XML重新粘贴到feature.xml中变得很烦人。

  • 虚拟服务在每个部署上重新创建功能GUID。这对开发非常有用,但是这意味着您不能具有其他功能 功能依赖 在您的清单功能上。如果您试图创建功能部件层次结构或合理化功能部件,以便激活一个功能部件将激活解决方案中给定部分的所有必需功能部件,则可能会很痛苦。

不过,您现在可以为您添加的每个列表提供一个功能。好吧,实际上,您为添加的每个列表都有2个功能。为什么?因为一个是列表 实例 另一个是列表 模板。请注意,如果您不希望用户能够从此模板中创建列表,则可以停用列表模板的功能。


本系列的下一步-如何创建从列表中获取其数据的站点列(字段)。

15条评论:

匿名 said...

您提供的信息非常有用。但是,当您卸载该功能时,我注意到列表仍然保留在站点中,并且当您单击列表时,会出现错误。当您重新安装并重新激活该功能时,列表将包含重复项。我假设列表永远不会被完全删除,因为它仍然显示在站点下。卸载功能后如何确保完全删除列表?

克里斯·奥'Brien说过...

好问题。在我看来,当有数据丢失的机会时,停用此功能将不会删除站点工件。因此,列表,正在使用的网站列,页面布局/母版页等内容都不会被删除。

如果您完全确定可以删除列表(无论添加了任何数据),则应该可以使用功能接收器来指定在停用功能时执行的代码。然后,您可以使用对象模型来查找和删除列表。

当然,这意味着创建列表更加复杂,如果您使用的是VSeWSS,则必须在开发周期结束时将功能接收器属性添加到feature.xml文件中,然后自己构建.wsp文件(因为VSeWSS在每次部署时都会覆盖文件)。

据我所知,这是唯一的方法。

HTH,

克里斯。

匿名 said...

我的另一条评论!!(洛朗)
您能告诉我们一些有关将资源文件与功能一起使用而不是对值进行硬编码的能力的信息吗,例如具有多L的功能!
你知道那件事吗?

非常感谢
劳伦特

克里斯·奥'Brien说过...

好吧,我想这只是一天结束时的标准.Net 2.0本地化。有趣的是,当SharePoint处理CAML时,它了解如果遇到特定格式的令牌,则应从资源文件中查找字符串。

我无法真正提供具体的指导,但是您可以交叉引用MS CAML实例(例如,在Features文件夹中),这些实例使用资源字符串与资源文件/程序集中的实际值(使用反射器)。这应该使您能够找到用于创建自己的资源程序集的令牌格式。

阿米特 说过...

克里斯你好

我想基于自定义列表部署7个列表,并创建每个实例。

实现此目标的最佳方法是什么?

我需要为每个列表创建一个新项目吗?

您的帮助。

阿米特

克里斯·奥'Brien说过...

阿米特

不,您不需要每个列表都有单独的项目。如果您使用的是VSeWSS,则只需在VS项目中执行“添加新项”,然后为7个列表中的每一个选择“列表定义”。您应该选中指定您还希望创建列表实例的框。

然后,VSeWSS将所有必需的文件添加到项目的文件夹下,因此与列表有关的所有内容都在此处。

希望这可以帮助,

克里斯。

匿名 said...

创建列表实例(其中列表具有PeoplePicker字段)时,数据的正确格式是什么。我已经尝试过用户名,电子邮件地址和其他许多格式。任何帮助将不胜感激。

中密度纤维板

未知说过...

克里斯,您好,我最近几周才开始从事WSS 3.0的开发,并决定从有点“轻松”的VseWSS 1.0路线开始,然后再动手使用所有feature.xml内容; o)

我有一个自定义列表,并且自定义了NewForm.aspx / EditForm.aspx页面,以声明方式在每个页面的主区域中添加了一个Web部件,我希望该Web部件可以替换放置在此处的ListForm Web部件。默认-但是当我同时部署这两个部件时,显示了什么,如何完全替换“新建/编辑”列表表单页面的ListForm Web部件呢?

克里斯·奥'Brien说过...

你好

这里可能发生的是,这2个Web部件以不同的方式添加-一个已直接添加到页面(即,当您对其进行自定义时),而另一个已添加到功能的XML定义中。

如果您还没有遇到这种情况,可以通过使用功能的Elements文件中的“ AllUsersWebPart”标签将Web部件添加到区域中。这是将默认Web部件添加到页面的首选方法(即,一旦创建页面,它们便会出现)-我建议您不要在SPD中自定义页面,而建议使用此标记来包含您的自定义Web部件,而不是标准ListForm。

HTH,

克里斯。

克里斯·奥'Brien说过...

@MDF,

很抱歉延迟回复,我一直在度假。

这是一个很好的问题,恐怕我不知道答案永远不需要以这种方式使用人员/组列。找到答案了吗?

克里斯。

未知说过...

克里斯你好
花时间写这篇文章。
目前,我正在使用VSeWSS创建自定义列表。我的问题是,一旦部署到我的站点,我添加到列表中的新字段就会显示在AllItems.aspx和列表设置中,但是当您尝试添加新字段时它们不会显示在NewForm.aspx中。列表中的新项目。
我在这里缺少基本的东西吗?

谢谢

提姆

克里斯·奥'Brien说过...

@Tim,

嗯,我还没有看到这种行为。不过,我想知道,是否可能在过程中的某个时刻在SharePoint Designer中打开了NewForm.aspx?我对此不太确定,但如果文件是自定义的,则有可能(请参见 我的鬼影/虚幻帖子),则可能无法读取当前列表架构来生成表单。就是说,我希望表单是由控件生成的,因此自定义文件不会产生这种效果。

如果使用VSeWSS将新列表添加到项目中并重新部署,会发生什么情况?

干杯,

克里斯。

未知说过...

克里斯
我创建了另一个列表,并向其中添加了以下内容(*** =我的添加,删除了尖括号以在此处发布):

领域
***字段ShowInNewForm =“ TRUE” Id =“ {{A973951A-A379-4405-9AF8-EFAE1690E5D9}}” Name =“ NewLocation” *** DisplayName =“ 新地点” Required =“ TRUE” Type =“ Text”
***/领域
/字段


视场
FieldRef Name =“ LinkTitleNoMenu”
/ FieldRef
*** FieldRef名称=“ NewLocation” / FieldRef
/ 视场

工具栏类型=“标准” /
视场
FieldRef Name =“附件”
/ FieldRef
FieldRef Name =“ LinkTitle”
/ FieldRef
*** FieldRef名称=“ NewLocation” / FieldRef
/ 视场

结果与以前相同– I notice the “New Location” fields doesn’t出现在allitems.aspx中,直到将其添加到第二个视图中为止。

我怀疑问题可能与未创建自定义内容类型来保存新字段有关,我’会先重新开始创建内容类型,然后再看一看。
T

未知说过...

仍然没有喜悦–我只是尝试手动创建所有文件,而不是使用VSeWSS,我还使用了Features \ 领域中的一个字段,而不是自己创建一个。与以前相同的结果,该功能安装没有错误,但是当我在网站上创建它的实例时,只有标题字段显示在创建表单上。
I’m将我的schema.xml基于Features \ CustomList中的一个副本,并进行以下更改:
1.在内容类型中,将文件夹TargetName更改为我的自定义列表的文件夹
2.在“字段”中,从“功能\字段”中添加要添加的字段的完整字段定义
3.在两个ViewField扇区中添加我的额外字段
我会错过一些重要的额外阶段吗?
据我所知,features.xml文件,清单等都很好,并且在部署时或创建列表实例时没有错误,将其添加到列表等。

任何建议欢迎–这让我发疯!

谢谢

提姆

克里斯·奥'Brien说过...

蒂姆,你好

这么晚才回复很抱歉。嗯,我不确定会出什么问题,但是我还不需要修改要部署为功能的列表的架构。在我看来,如果在创建列表或添加项目时没有错误,则架构定义应该可以。不过,有一件事-我注意到您在字段ID值中有两个大括号-这只能是一个大括号。

否则,我建议我换一个角度来看:使用UI快速创建测试列表,然后使用诸如以下工具检查其背后的CAML Stramit的CAML查看器。然后,您将能够比较自己生成的内容和SharePoint生成的内容。

HTH,

克里斯。