2012年8月30日,星期四

在SharePoint 2013应用程序中创建列表,内容类型,字段等

免责声明:仅因为我’m writing about 应用, doesn’并不意味着我认为SP2013中的所有内容都应作为应用程序开发!一世’m focusing on 应用 simply because it’这是一个有很多东西要学的地方。

最近我’一直在构建SharePoint 2013应用程序来帮助我学习框架–特别是具有某些SharePoint组件的本地应用程序,而不是纯远程应用程序。本系列基于一些我认为是应用程序关键构建块的场景–对于给定的一组要求,您’我可能需要做这些事情中的一项或多项。坦白说,您可能还需要做100件事,但是这些当然很常见。这里’是该系列的粗略轮廓(我’可能会进行调整,并且肯定会增加):

  1. SharePoint 2013 应用 –架构,功能和UX注意事项
  2. 入门–在SharePoint应用程序中创建列表,内容类型,字段等(配置) [本文]
  3. Working with data in 的应用程式网页, 和 why you should
  4. Access end-user data (in 的host web) from a SharePoint 2013 app
  5. Rolling out SharePoint 2013 应用 to 的enterprise - tenant scope 和 PowerShell installs
  6. Azure is 的new SharePoint ‘_layouts’ directory
  7. “Host web 应用” – provisioning files (e.g. master pages) to 的host web
  8. “Host web 应用” –设置字段和内容类型
  9. Deploying SP2013 provider-hosted 应用/Remote Event Receivers to Azure Websites (for Office 365 应用)
  10. 在SharePoint应用程序中使用Web部件

您’ll notice that I’m skipping setting up a SharePoint 2013 dev environment for developing 应用. I think other folks have done a good job here –这里有一些很好的资源:

开始之前– understanding 的‘app web’ 和 security model

如果你’重新开始为SharePoint开发应用程序,然后我’m假设您对应用程序和托管网站的分离有所了解。简而言之,应用与‘real’最终用户SharePoint网站–该应用程序创建的任何列表和文档库,任何文件和网页,都位于与宿主站点不同的Web应用程序中。当用户单击该应用程序时,他们将主机站点留在后面,并被重定向到为该站点安装应用程序时创建的网站。有效地‘app web’将为应用程序安装到的每个站点创建一个镜像结构,该结构可镜像宿主站点本身。

安全是该架构的主要驱动力–该应用程序本身对该完全创建的网站具有完全控制权,但对宿主网站没有权限(默认情况下)。显然,如果恶意应用程序可以删除最终用户数据,则为A 非常 Bad Thing. Microsoft would not want that to happen, 和 so we have this separation. 加 itionally, it also serves to provide protection against cross-site scripting (IF 的web application created for 应用 does not use 的same domain or a subdomain –(不应),并且允许SharePoint标识客户端对象模型调用的调用方。

UPDATE 17 Sept 2012: Actually there are circumstances where 的developer *can* choose to have 的lists/files/web pages etc. created in 的host web rather than 的应用程式网页. See 的second half of 的next article in this series Working with 的应用程式网页, 和 why you should 对此进行讨论。

如果你 need more detail this host/app web split, then Ted Pattison has a nice post (in a great series) 在 SharePoint 应用 are isolated with respect to request processing 和 storage. 您 might not need to understand everything about this right now, but you shouldn’t ignore it.

入门–创建您的第一个SharePoint托管的应用

这里没什么复杂的–只需启动Visual Studio 2012并从‘适用于SharePoint 2013的应用’ project template:

CreateAppProject

您’然后将要求为该应用程序指定一些设置–在这里,我们需要告诉Visual Studio我们在哪个本地站点’我们将开发/部署,并创建一个SharePoint托管的应用程序:

指定应用程序设置

项目已创建,您’会看到自动添加了一堆文件–这实际上是一个“Hello World”示例,对您入门很有帮助。引用了jQuery,将Default.aspx页面添加到了应用程序中,该页面引用了CSS文件(App.css)和JavaScript文件(App.js)–JavaScript文件具有一些CSOM代码以提取当前用户’的名称并将其放在页面上的DIV中:

AppDefaultFiles

如果你 hit F5 to deploy this, you’会看到结果是一个相当空白的页面,其中显示了您的应用’的标题(在我看来还没有转换成用户友好的名称),并且在大约一秒钟的时间内完成AJAX调用后,显示了您的用户名:

AppDefaultPage

在这一点上’考虑此示例页面没有的功能很有趣:

  • 任何形式的左导航/快速启动
  • Top navigation (although 的more global strip in 的chrome across 的top exists)
  • Breadcrumb (although note 的single link back to 的host web, ‘Team 2’)
  • 网站操作菜单
  • 指向“网站内容”页面的链接(N.B.无法在应用程序中查看此页面 – if you try, you’会得到类似“的endpoint /team2/cobsharepointappsmyfirstapp/_layouts/15/viewlsts.aspx is not accessible in 的context of a SharePoint App.”

所以’s a pretty “bare bones”初始点。现在让’s take this towards something a bit more like a 真实-life app.

的concept - my "learner”时间记录示例应用

To help us understand 的app framework, let’说我们必须建立某种 时间记录应用。我们中的许多人都在以利用率为中心的咨询组织中工作,因此时间表的概念通常太熟悉了。  的app I’m going to show won’没有获得任何功能性或设计奖–它绝对没有’提供足够的最终用户价值以考虑将其提交到应用商店:)’纯粹是为了帮助我了解应用程序,而我’d即使设计不切实际或不可行,也应探索不同的领域’t 真实ly make sense.

这里’是现在的样子,尽管我’在本系列文章的过程中,可能会添加一些信息:

TimeTracking_SummaryUnderTarget 

TimeTracking_LogTime

TimeTracking_SummaryMetTarget 

应用实施

In terms of artifacts, some fundamental pieces of 的app include:

  • 项目s list
  • 记录时间清单
    • 使用TrackedTime内容类型– this defines 4 fields, including a lookup to 项目s 和 a Person/Group field for employee
  • 利用目标 (per employee) list
  • 默认页面
  • “My time summary” page –这实际上是一个navigation-free version of Default.aspx
  • 要显示的应用程序部分(ClientWebPart)“My time summary” page in host web

正如我在 SharePoint 2013 应用 –架构,功能和UX注意事项,’重要的是要理解(或记住),除少数例外,SharePoint托管的应用只能将内容置备到自动创建的“app web”。这生活在“apps” web application which must be created in an on-premises scenario. 的diagram below tries to illustrate 的breakdown between host site 和 应用程式网页 –重要的是,请注意 的“Utilisation targets” list in 的host web was manually created outside of 的app –纯粹是因为我希望我的应用程序包含在主机Web中处理数据的场景。 换句话说,你 通常不能 get your app to provision a list in 的host web. 的only exception to this is if 的app has Full Control to 的host web, 和 some CSOM code runs to create this list - see Working with 的应用程式网页, 和 why you should 讨论这种情况。请注意,您可以单击下面的图片查看较大的版本:

TimeTrackingApp 

SharePoint托管的应用程序中的配置列表,内容类型,网站列等

所以这里的好消息是’如果您有很多改变’我已经在SharePoint 2010 / Visual Studio 2010中完成了这些平常的任务。也就是说,如果您没有’不要期待他们。当然,主要区别在于’不要在实际网站本身中创建东西–在最初阶段’很难知道您的工件是否正在成功配置。

I’我将不会展示部署上述工件的从头到尾的过程,但让’看轮廓。根据您的工作方式,您可能希望从以下内容开始:

  • 改名‘Feature1’它会自动添加到您的VS项目中,添加说明等。
  • Create some folders in your project if you prefer more structure than 的default

创建字段和内容类型

我创建了一个 追踪时间 具有4个字段的内容类型。对于我的项目列表,我没有’实际上定义了自定义内容类型– a simple list purely with a 标题 field sufficed.

  1. Right-click on 的project in Solution Explorer, then select > 新物品 …
  2. From 的Office/SharePoint category, select 网站栏 和 name 的item accordingly:

     CreateFields  
  3. Visual Studio将为您添加一些默认XML。为了定义TrackedTime内容类型所需的4个字段,我最终得到了以下XML–请注意对Projects列表的查找,这完全是通过声明性XML来完成的。“List=’Lists/Projects’” on 的3rd field:
       1: <?xml version="1.0" encoding="utf-8"?>
       2: <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
       3:   <Field
       4:        ID="{ac8a5625-8769-4ed5-bfce-5ced1bfda792}"
       5:        Name="TimeTrackingEmployee"
       6:        DisplayName="Employee"
       7:        Type="User"
       8:        List="UserInfo"
       9:        Required="TRUE"
      10:        ShowField="ImnName" 
      11:        UserSelectionMode="PeopleOnly"
      12:        UserSelectionScope="0" 
      13:        Group="COB time-tracking site columns" />
      14:   <Field
      15:        ID="{CA358CA2-ED71-49D9-A05F-51C92B504062}"
      16:        Name="TimeTrackingDate"
      17:        DisplayName="Date"
      18:        Type="DateTime"
      19:        Format="DateOnly"
      20:        Required="TRUE"
      21:        Group="COB time-tracking site columns" />
      22:   <Field
      23:        ID="{ED1B7F0F-CACA-45A1-A0DD-8D0E6E604C5C}"
      24:        Name="TimeTrackingProjectName"
      25:        DisplayName="Project/task"
      26:        Type="Lookup"
      27:        List="Lists/Projects"
      28:        ShowField="Title"
      29:        Required="TRUE"
      30:        Group="COB time-tracking site columns" />
      31:   <Field
      32:        ID="{62D635BE-6481-4E2A-A6B6-4CDA40EAFB00}"
      33:        Name="TimeTrackingDuration"
      34:        DisplayName="Duration (hours)"
      35:        Type="Number"
      36:        Decimals="1"
      37:        Required="TRUE"
      38:        Group="COB time-tracking site columns" />
      39: </Elements>
  4. 为了使用这些字段创建内容类型,我选择了 > 新物品 … 然后选择 内容类型 并命名为:

    CreateContentType1

    CreateContentType2 
  5. 下一步是将我们创建的字段添加到内容类型。 Visual Studio 2012拥有一个很酷的新Content Type Designer,出现在这里–只需开始输入字段名称,VS就会从它连接到VS解决方案中定义的PLUS字段的SharePoint网站中扫描字段:

    VS2012ContentTypeDesigner
    然后,在设计器后面的内容类型XML中,此处添加的任何字段都将被引用为FieldRef元素。

  6. 现在我们’准备根据此内容类型/字段集提供列表。初始步骤与您惯常的步骤相同,但同样,我们有一个方便的VS设计器可以帮助您。首先,我们需要做一个 > 新物品 … 然后选择 清单, 然后适当地命名:

     创建列表
      创建列表 2  
  7. 现在我们看到了新的列表设计器–如果我们想直接将字段添加到列表中而不是添加内容类型,则可以使用“列”标签的主区域,但是通常’ll want to hit 的‘Content Types’ button:
      创建清单3
  8. 在这里,我们可以输入SharePoint网站或VS解决方案中已经存在的内容类型的名称:

     创建清单4
  9. 通常我们’d also want to delete 的 项目 content types, to leave just our custom content type with 的fields:

     创建清单5
  10. 的‘Views’列表设计器中的“标签”可用于添加任何自定义视图–就我而言,我添加了一个‘By employee’:

     创建清单6  
    N.B. 不幸的是设计师没有’不支持您可能想做的所有事情,因此在我的情况下,我手动编辑了XML(很恐怖!)以实际实现分组。尽管如此,这一切都比以前的SharePoint 2010开发要好。

  11. 最后一步是确保我们’对列表的顶级属性(例如标题和URL)感到满意。记下将提供列表的URL,您’ll need this soon:

     创建清单7  
  12. 要是我们’对列表满意后,我们可以点击F5来测试我们的应用。当我们从“网站内容”页面点击进入应用程序时,’ll be back here:

    AppDefaultPage
    At this point, 的big question is…

“Where’s my list?!”

当然,因为那里’在应用中没有默认导航,’如果已配置列表,则不是立即显而易见。但是,如果你’我做了正确的事情’会发现您的列表实际上在那里。它’当然可以尝试在URL栏中键入/_layouts/viewlsts.aspx,但是正如我之前提到的那样,’不是可在应用程序中使用的页面。

Instead, just paste 的URL of 的list directly into 的browser address bar after 的app URL 并且应该将您带到新设置的列表中:

预备清单

如果你 do not wish 的list to be “hidden”(即您希望用户将其用作常规列表),下一步就是考虑导航– 和 what you’将添加到该默认页面,以便用户可以进入列表。

概要

So we now have a list which our app could use to store data. We could either allow end-users to access 的list through 的UI, use CSOM to read/write to it, or a combination of both. 如果你’从SharePoint 2010中的Visual Studio创建列表,内容类型等后,您应该发现该过程几乎完全相同–主要区别在于新的VS设计师以及我们’re provisioning to 的应用程式网页.

下次我们’ll look 在 working with data in 的应用程式网页.

7条评论:

shan山高瓦勒 说过...

非常感谢..很好的解释

温森 说过...

I found out that 的list could not look up 的标题 field of 的'Project'清单。因此,我该如何配置'Project' list into 的应用程式网页?

SkandaRamana 说过...

代替viewlsts.aspx,我们可以使用的是/_layouts/15/mcontent.aspx,虽然它与查看列表不同,但确实可以指示列表并直接访问设置

罐头 说过...

添加文本或数​​字字段时,一切都很好。但是添加分类法字段时出了点问题。它不与条件集绑定

'Brien 说过...

@canperk,

对,就那个'正确-分类法字段需要额外的步骤才能将其绑定到其术语集。碰巧的是,我最近写了这本书-请参阅 开发人员在SharePoint / Office 365中置备托管元数据字段的三种云友好方式

HTH,

克里斯。

大卫·甘布尔顿 说过...

克里斯,你好

我希望所有人'很好:)感谢您编写此有用的指南。

I'm having an issue with deploying a lookup field within a SharePoint hosted app solution. I have set 的清单="Lists/MyList"在架构中,并且ShowField ="Title"按照上面的示例,但该字段没有'部署时似乎已链接。

Could it possibly be an issue with me deploying both lists from 的same feature?

干杯

大卫

'Brien 说过...

嗨,戴夫!

设置其他字段时,肯定需要存在来自查找字段的列表。通常,如果两个要素都在同一个要素中,则此方法就可以正常工作-但由于事物要按照它们来的顺序(在要素元素中)进行处理,因此,您将要确保另一个列表位于要素元素中,而该要素元素要高于要素列表规定了该领域。

希望有道理:)

干杯,

克里斯。