SharePoint 创建 Lookup 类型的Site Column解决跨站问题
2013-10-26 15:54
471 查看
在某些情况下,我们需要去引用其他List中的数据,比如在网站集(Site Collection)上有个List叫Country,在其子网站(WebSite)有个List叫Employee,如果要在子Site上的Employee去引用Country中的数据,一般我们会在Site Collection上创建一个网站栏(Site Column)。这是一种解决方案。还有一种解决方案,我们也可以在项目中创建一个Lookup 类型的 Site Column,其Scope为Site,顺着思路,我理所应当的创建了一个Site Column,Scope=Site,但事实上远没这么简单。
其实两种方式都是可以的,先来看第一种解决方式:
网站设置下创建网站栏
我以SharePoint 2013 Foundation为例,登录SharePoint Site Collection,点击Site settings:![](https://oscdn.geek-share.com/Uploads/Images/Content/201310/e08417d1430aecbc152b9356fd747a28.png)
找到Web Designer Galleries(Web设计器库),点击Site columns:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201310/d0365e4072cc092a6d93732ab3dfbf4c.png)
点击创建:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201310/956571e86a969cd099d3a158c46d89a7.png)
创建Lookup(查阅项)类型的Column,并为其选择信息来源:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201310/9aeaff2201101ae5512c9d5fa76cbfed.png)
接着,就可以在子站中使用该Column,同理进入子站,打开Employee List,点击列表设置,为其添加Column:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201310/faf7474a2f75c46497492e246e69ec2a.png)
在相应的组中找到自定义的Lookup类型的Column,点击添加即可:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201310/4debc129d6e2145d06e38d6ffafff406.png)
这样就可以在跨站引用其他List中的数据了:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201310/1b18f73c77fb9307a48e30544eed70c4.png)
当然,这是一种最简单的方法,但不妥的是需要手动去添加,而且在项目中也不能给List添加此字段,我突然想到为何不在项目中创建一个Site Column,这样就可以批量化的去进行一些操作了,从而避免了多次需要手动添加。
在项目中创建Lookup类型的Site Column
创建Site Column,为了和之前的作区分,故叫"国籍2":<?xml version="1.0" encoding="utf-8"?> <Elements xmlns="http://schemas.microsoft.com/sharepoint/"> <Field ID="{605b3bbf-40ed-4cc7-85a3-8b6547129bf1}" Name="CountryField" StaticName="CountryField" DisplayName="国籍2" Type="Lookup" SourceID="http://schemas.microsoft.com/sharepoint/v3" List="Lists/CountryList" ShowField="LinkTitleNoMenu" Required="FALSE" Group="Custom Site Columns"> </Field> </Elements>
部署项目之后,找到此自定义的Site Column,发现其信息来源这儿压根没有设置上去:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201310/e9dce8e194e5d27997e89c0c5fa04ff1.png)
看来要在项目中新建一个Look up类型的Site Column并非这么简单,所以我尝试用PowerShell导出 Employee List,查看国籍Field的SchemaXml
Add-PSSnapin "Microsoft.SharePoint.PowerShell" $site=Get-SPSite "Http://oa.kingdom.com/sites/test" $web=$site.AllWebs["testSite1"] $list=$web.Lists.TryGetList("Employee") $list|Select -ExpandProperty SchemaXml |Out-File -FilePath "C:\field.txt"
找到自定义的"国籍"Field:
<Field Type="Lookup" DisplayName="国籍" Required="FALSE" EnforceUniqueValues="FALSE" List="{d5907d52-99f0-49ed-85cb-f72f6e3bce4f}" WebId="0defd255-9fe9-454b-a34a-be7a86c84597" ShowField="Title" UnlimitedLengthInDocumentLibrary="TRUE" Group="自定义栏" ID="{44e07d2e-e367-479d-863e-179bdd5bd674}" SourceID="{0defd255-9fe9-454b-a34a-be7a86c84597}" StaticName="国籍" Name="_x56fd__x7c4d_" Version="1" ColName="int1" RowOrdinal="0"/>
找到不同了吗?"国籍"和"国籍2"两个都是Type=Lookup类型的字段,它们最大的不同是List和SourceID、WebId数据的不同,经过调试,发现List应该对应的是List 自己的ID,SourceId对应的是List所在的web Id,所以我需要动态的改变这两个值。到底怎样实现呢,当然是Feature 激活的时候去动态修改。
public override void FeatureActivated(SPFeatureReceiverProperties properties) { SPSite targetSite = properties.Feature.Parent as SPSite; using (SPSite site = new SPSite(targetSite.ID)) { using (SPWeb web = site.OpenWeb()) { SPField lookupField = web.Fields.TryGetFieldByStaticName("CountryField"); if (lookupField != null) { // 得到CountryField的Schema XDocument fieldSchema = XDocument.Parse(lookupField.SchemaXml); XElement root = fieldSchema.Root; if (root.Attribute("List") != null) { // 得到List对应的url string listurl = root.Attribute("List").Value; SPFolder listFolder = web.GetFolder(listurl); if (listFolder != null && listFolder.Exists) { XAttribute attrList = root.Attribute("List"); if (attrList != null) { attrList.Value = listFolder.ParentListId.ToString(); } XAttribute attrWeb = root.Attribute("SourceID"); if (attrWeb != null) { attrWeb.Value = web.ID.ToString(); } lookupField.SchemaXml = fieldSchema.ToString(); } } } } } }
我们到网站设置下查看以下是否已经正确设置了信息来源:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201310/ab1961ee721b1b98905adc6dd9cdeb62.png)
接着我们再去验证下跨站是否正确,可以在子站Employee下获取到CountryList中的数据,发现可以跨站获取国籍2对应List中的数据,这将为我们今后在项目中可以重用这个字段提供了方便:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201310/dcbecc51feed0a483fc57fbc0b6da42d.png)
总结
相关文章推荐
- SharePoint 创建 Lookup 类型的Site Column解决跨站问题
- SharePoint 创建 Lookup 类型的Site Column解决跨站问题
- SharePoint 创建 Lookup 类型的Site Column解决跨站问题
- SharePoint 创建 Lookup 类型的Site Column解决跨站问题
- SharePoint 创建 Lookup 类型的Site Column解决跨站问题
- 一步一步SharePoint 2007之二十一:解决实现注册用户后,自动具备访问网站的权限的问题(3)——创建用户
- 一步一步SharePoint 2007之二十一:解决实现注册用户后,自动具备访问网站的权限的问题(3)——创建用户
- SharePoint 2007 Restore Site Collection遇到的网站集Url缓存问题【已解决】
- Eclipse 创建Maven scala 项目安装并解决加载项目类型慢的问题
- SharePoint里如何解决超长LookUp字段需要双击的问题
- 一步一步SharePoint 2007之二十一:解决实现注册用户后,自动具备访问网站的权限的问题(3)——创建用户
- 解决VS2013使用MySQL无法创建ADO.NET实体数据类型的问题
- 解决SharePoint无法正确显示文件类型图标问题
- 解决创建SharePoint网站的时候使用IIS标头错误的问题
- SharePoint 2013 Step by Step——How to Create a Lookup Column to Another Site(Cross Site)
- [置顶] django-admin.py startproject mysite创建项目打开编辑器的问题的解决
- 解决问题:SSIS中,列“column”无法在 unicode和非unicode字符串数据类型之间转换
- SharePoint 2007 Restore Site Collection遇到的网站集Url缓存问题【已解决】
- 如何在SharePoint中创建HTTPS类型Site Collection?