如何通过代码在线开发sharepoint中的列表

Posted

技术标签:

【中文标题】如何通过代码在线开发sharepoint中的列表【英文标题】:How to develope list in sharepoint online by code 【发布时间】:2019-06-22 21:45:05 【问题描述】:

我们想在开发者网站上的租户中创建列表。我们想在我们的开发者站点中开发它,而不是使用包(可能是 sppkg)在客户端部署。

我们尝试使用 Sharepoint 插件在 Visual Studio 2017 中创建列表,并使用 SPFX 框架在 Visual Studio 代码中创建列表,教程基于 microsoft spfx 文档链接 - https://docs.microsoft.com/en-us/sharepoint/dev/spfx/web-parts/get-started/provision-sp-assets-from-package。

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

   <Field ID="060E50AC-E9C1-4D3C-B1F9-DE0BCAC300F6"
       Name="SPFxAmount"
       DisplayName="Amount"
       Type="Currency"
       Decimals="2"
       Min="0"
       Required="FALSE"
       Group="SPFx Columns" />

   <Field ID="943E7530-5E2B-4C02-8259-CCD93A9ECB18"
       Name="SPFxCostCenter"
       DisplayName="Cost Center"
       Type="Choice"
       Required="FALSE"
       Group="SPFx Columns">
   <CHOICES>
   <CHOICE>Administration</CHOICE>
   <CHOICE>Information</CHOICE>
   <CHOICE>Facilities</CHOICE>
   <CHOICE>Operations</CHOICE>
   <CHOICE>Sales</CHOICE>
   <CHOICE>Marketing</CHOICE>
   </CHOICES>
   </Field>

   <ContentType ID="0x010042D0C1C200A14B6887742B6344675C8B" 
       Name="Cost Center" 
       Group="SPFx Content Types" 
       Description="Sample content types from web part solution">
   <FieldRefs>
       <FieldRef ID="060E50AC-E9C1-4D3C-B1F9-DE0BCAC300F6" /> 
       <FieldRef ID="943E7530-5E2B-4C02-8259-CCD93A9ECB18" />
   </FieldRefs>
   </ContentType> 

 <ListInstance 
       CustomSchema="schema.xml"
       FeatureId="00bfea71-de22-43b2-a848-c05709900100"
       Title="SPFx List" 
       Description="SPFx List"
       TemplateType="100"
       Url="Lists/SPFxList">
   </ListInstance>

</Elements>

使用 SPFX,我们创建了 webpart,在代码中,我们在 elemnts.xml 和 schema.xml 中创建了 2 个列表。比我们在某些内容类型 ID 上遇到的问题。所以我们的问题是通过代码创建列表。任何人都可以给我们建议什么以及如何开发这些列表的最佳选择?

等等这两个简单的列表

员工 -name,surename 假期-员工,numberOfDays

【问题讨论】:

【参考方案1】:

不幸的是,XML 的文档有点难找。以下是我迄今为止在使用 SPFx 时所学到的概述:

字段

让我们从创建一些字段开始。如果要创建 SharePoint 列表,字段将代表列表的 。 Field 的基本概要如下(注意 #1 到 #5 仅供参考,不应在任何最终代码中包含):

<Field
1   ID="DAFF97CE-C27D-4D27-9863-4422526CC395" 
2   Name="EmployeeName" 
3   DisplayName="Name" 
4   Description="Column for the employee's first name." 
5   Type="Text" 
/>

    ID: 字段的 GUID(G局部U唯一的ID实体)。您需要生成一个。使用在线生成器,例如this one - 确保它是大写、带连字符和大括号 (reference)。 Visual Studio 有一个内置的生成器,如果你正在使用它。

    名称: 字段的内部名称。这是存在于“引擎盖下”的名称。如果您以编程方式与 Field 进行交互,这就是您将使用的名称。

    DisplayName: 字段的显示名称。这是在 SharePoint 中显示的名称。它通常仅用于演示目的。

    描述:字段的文本描述。有助于记住字段的用途,但在其他方面并不重要。

    类型:这是重要的。它定义了您将创建什么样的列。正如您在 SharePoint Web 界面中创建列时可能看到的那样,有很多不同的类型,例如“单行文本”、“日期和时间”、“个人或组”、“计算”等。类型属性直接映射到这些允许的选择。

类型

困难的部分是弄清楚 Type 的允许值是什么。值得庆幸的是,这些记录在in the Field element specification 中。向下滚动到类型所在的行。

根据您选择的类型检查文档是否存在其他必需或可选属性。例如,对于 Number 类型,您可以有额外的属性 DecimalsMinMax。下面,我们可以指定天数,您只能选择一个整数,请假不能少于 1 天,也不能超过 30 天。

<Field
    ID="B34A7173-5AB7-4ABC-812B-EF8D0386498F" 
    Name="NumberOfDays" 
    DisplayName="Number of Days" 
    Description="The number of days employee will take off." 
    Type="Number" 
    Decimals="0"
    Min="1"
    Max="30"
/>

列表字段与站点字段

创建字段后,您可以选择:Should these fields be List Columns or Site Columns?

输入到schema.xml 中的字段将变为列表列;换句话说,仅限于该列表。 输入到elements.xml 的字段将成为站点列。

请记住此选择,并保留您创建的字段定义。我们会回到他们身边。

列表

现在让我们创建一个列表架构。您不必(也不应该)必须从头开始创建这个东西 - 查看下面的样板并将其复制并粘贴到您的解决方案中(同样,左侧的数字仅供参考):

<List xmlns:ows="Microsoft SharePoint" 
1   BaseType="0" 
    Direction="$Resources:Direction;" 
    xmlns="http://schemas.microsoft.com/sharepoint/">
    <MetaData>
        <ContentTypes />
2       <Fields></Fields>
        <Views>
            <View BaseViewID="1" 
                Type="html" 
                WebPartZoneID="Main" 
                DisplayName="$Resources:core,objectiv_schema_mwsidcamlidC24;" 
                DefaultView="TRUE" 
                MobileView="TRUE" 
                MobileDefaultView="TRUE" 
                SetupPath="pages\viewpage.aspx" 
                ImageUrl="/_layouts/images/dlicon.png" 
                Url="AllItems.aspx">
                <XslLink Default="TRUE">main.xsl</XslLink>
                <JSLink>clienttemplates.js</JSLink>
                <RowLimit Paged="TRUE">30</RowLimit>
                <Toolbar Type="Standard" />
3               <ViewFields>
                    <FieldRef Name="<FIELD_1>" />
                    <FieldRef Name="<FIELD_2>" />
                    <FieldRef Name="<FIELD_3>" />
                </ViewFields>
                <Query>
                    <OrderBy>
                        <FieldRef Name="ID" />
                    </OrderBy>
                </Query>
            </View>
        </Views>
        <Forms>
            <Form Type="DisplayForm" 
                Url="DispForm.aspx" 
                SetupPath="pages\form.aspx" 
                WebPartZoneID="Main" />
            <Form Type="EditForm" 
                Url="EditForm.aspx" 
                SetupPath="pages\form.aspx" 
                WebPartZoneID="Main" />
            <Form Type="NewForm" 
                Url="NewForm.aspx" 
                SetupPath="pages\form.aspx" 
                WebPartZoneID="Main" />
        </Forms>
    </MetaData>
</List>

    BaseType:这表示您要创建的列表类型。 See this documentation for the allowed values. 通用列表(在 SharePoint Web 界面中单击“添加自定义列表”或“创建列表”时您将创建的类型)将为 0,并且可能是最常见的。另一个常见的选项是文档库,它是 1。

    字段:如果您选择将字段创建为列表列,您可以在此处粘贴字段定义。此处添加的字段定义将在创建列表时自动在列表中创建。 (如果您需要站点列,请保留 Fields 原样,并保存您的字段定义以供以后使用。)

        <!-- ... -->
        <ContentTypes />
        <Fields>
            <Field
                ID="DAFF97CE-C27D-4D27-9863-4422526CC395" 
                Name="EmployeeName" 
                DisplayName="Name" 
                Description="Column for the employee's first name." 
                Type="Text" 
            />
            <Field
                ID="AA4D083E-1B32-4AF5-B572-DA06B3996A94" 
                Name="EmployeeSurname" 
                DisplayName="Surname" 
                Description="Column for the employee's surname." 
                Type="Text" 
            />
        </Fields>
        <Views>
        <!-- ... -->
    ViewFields: ViewFields 定义将在与其关联的视图中可见的列。 (使用 Views 是另一篇文章的更高级主题。)现在,请确保您添加到列表中的每个字段都有一个 FieldRef。确保指定每个字段的内部名称。 (无论您想要列表列还是站点列,始终这样做。)
                <!-- ... -->
                <Toolbar Type="Standard" />
                <ViewFields>
                    <FieldRef Name="EmployeeName" />
                    <FieldRef Name="EmployeeSurname" />
                </ViewFields>
                <Query>
                <!-- ... -->

现在您有了一个列表架构,它定义了您需要了解的有关列表的所有信息。

注意:如果您需要多个不同的列表,则必须创建多个列表架构文件。只需复制并粘贴样板模式,并以与上述相同的方式添加修改。

元素

最后,让我们将所有内容联系在一起。 elements.xml 是您告诉 SPFx 您想要配置的每个项目的位置。

要创建一个列表,您需要一个 ListInstance 元素。 Here is the documentation. 下面是elements.xml 文件的示例(再次重申,左边的数字仅供参考):

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

    <ListInstance
1       CustomSchema="schema-employees.xml" 
2       Description="List for employee name and surname." 
3       FeatureId="00bfea71-de22-43b2-a848-c05709900100" 
4       TemplateType="100" 
5       Title="Employee Names" 
6       Url="Lists/EmployeeNames"
    />

</Elements>

    CustomSchema: 我们之前处理的列表架构文件的名称。在这种情况下,我将其命名为 schema-employees.xml - 您可以随意命名,只要确保名称匹配即可。

    说明:列表的文字说明。不太重要。

    FeatureId: 回想一下,在前面的列表架构中,我们决定使用BaseType="0" 创建一个自定义列表。自定义列表有一个对应的功能 ID,它必须与创建的列表类型相匹配。 See here for a list of feature IDs. 找到 CustomList 的功能名称以仔细检查功能 ID 是否相同。如果您要配置其他类型的列表,例如文档库,则必须到这里来查找相应的 FeatureId

    模板类型:这是另一个必须匹配创建的列表类型的部分。 See here for a list of template types. 在这种情况下,看到 GenericList 映射到 TemplateType100。文档库将是 101 等。

    标题:列表的可见标题,将显示在站点的站点内容中。不太重要。

    Url: 这规定了您可以在其中找到此列表的 Web URL。通常,您在使用 SharePoint Web 界面创建列表时可能已经注意到,自定义列表位于 /sites/YOUR_SITE/Lists/ 下。上面的示例遵循此约定,但您也可以将 URL 设置为其他值。

这就是ListInstance 的全部内容。此外,如果您决定将字段实现为站点列elements.xml 是您粘贴字段定义的位置。只需确保将Fields 粘贴在ListInstance 之前,否则SharePoint 将不知道您指的是什么字段(它们还不会被创建!)。

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

    <Field
        ID="DAFF97CE-C27D-4D27-9863-4422526CC395" 
        Name="EmployeeName" 
        DisplayName="Name" 
        Description="Column for the employee's first name." 
        Type="Text" 
    />

    <Field
        ID="AA4D083E-1B32-4AF5-B572-DA06B3996A94" 
        Name="EmployeeSurname" 
        DisplayName="Surname" 
        Description="Column for the employee's surname." 
        Type="Text" 
    />

    <ListInstance
        CustomSchema="schema-employees.xml" 
        Description="List for employee name and surname." 
        FeatureId="00bfea71-de22-43b2-a848-c05709900100" 
        TemplateType="100" 
        Title="Employee Names" 
        Url="Lists/EmployeeNames"
    />

</Elements>

指定elements.xml后,我们已经成功地为我们要创建的列表创建了一个XML定义!

最后的说明

不要忘记,为了让 SPFx 了解 schema-employees.xmlelements.xml,您必须将它们作为功能定义的一部分包含在 package-solution.json 中。这在the tutorial linked in the original question 中有解决,但我还是想记下它。

【讨论】:

谢谢@Richard Li,我也有关于如何为客户创建一个完整的解决方案然后部署到他的租户等问题。我们已经创建了 Employee 和 Vacation 列表,现在我们需要创建一些工作流程,因为我们想使用这个列表来观察员工的工作时间。那么我们如何在这个 webpart 中创建工作流,这可能吗?你有什么建议我,因为我们尝试了几个月来回答这个问题,但我们失败了。简单地说 - 我们需要一个包含列表和工作流的包并部署到客户租户,我们应该如何做以及我们应该使用哪些 SP 技术? 我在工作流方面没有太多经验,但不幸的是,您似乎无法通过 SPFx (1) (2) 创建/提供工作流。但是,您可以使用 PnP PowerShell 添加工作流,也许您也可以使用它来部署 SPFx 包。【参考方案2】:

非常感谢您提供完美的信息,这正是我们正在寻找的! 您建议复制和粘贴列表定义 i VS(或其他 IDE)。我想问你有没有办法设计包含人员、查找、计算和另一个“高级”列的列表,并下载 XML 模式定义以复制并粘贴到 VS 中,因为我需要 sppkg 的最终包解决方案?这是因为我发现这种方式比 VS 中的所有代码要快得多。 谢谢。

【讨论】:

我猜你是在问一些在线图形设计工具来帮助你设计一些列表 - 我不知道任何东西,遗憾的是,虽然那会非常好。最接近的是,您可以在 SharePoint 中设计包含所有高级列、视图等的列表,然后下载 XML(this is the method I use,在 SP Online 中仍然有效),您应该能够复制并 -粘贴部分字段、视图等

以上是关于如何通过代码在线开发sharepoint中的列表的主要内容,如果未能解决你的问题,请参考以下文章

SharePoint 列表多表联合查询

如何设置SharePoint中数据表视图的权限?

无法在Sharepoint 2013在线自定义列表中使用SPD获取Lookup字段值

如何在线访问“APP for Sharepoint”页面 sharepoint

如何通过 REST API 在另一台服务器上为 Sharepoint 2013 和 Sharepoint Online 运行的脚本中更新 SharePoint 列表?

通过 SharePoint 中的 javascript/SP 服务根据用户组成员身份在列表视图中隐藏项目行(整行)