在某些情况下,我们需要去引用其他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:

  • 找到Web Designer Galleries(Web设计器库),点击Site columns:

  • 点击创建:

  • 创建Lookup(查阅项)类型的Column,并为其选择信息来源:

接着,就可以在子站中使用该Column,同理进入子站,打开Employee List,点击列表设置,为其添加Column:

在相应的组中找到自定义的Lookup类型的Column,点击添加即可:

这样就可以在跨站引用其他List中的数据了:

当然,这是一种最简单的方法,但不妥的是需要手动去添加,而且在项目中也不能给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,发现其信息来源这儿压根没有设置上去:

看来要在项目中新建一个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();
}
}
} }
} }
  • 我们到网站设置下查看以下是否已经正确设置了信息来源:

  • 接着我们再去验证下跨站是否正确,可以在子站Employee下获取到CountryList中的数据,发现可以跨站获取国籍2对应List中的数据,这将为我们今后在项目中可以重用这个字段提供了方便:

总结

源代码点击下载。

SharePoint 创建 Lookup 类型的Site Column解决跨站问题的更多相关文章

  1. SharePoint创建内容类型

    SharePoint创建内容类型 内容类型的用途是多种多样的.创建内容类型也非常简单. 1. 点击网站操作--网站设置. 2. 点击网站内容类型,点击创建. 3. 命名Beginning_ShareP ...

  2. CSRF(Cross Site Request Forgery, 跨站域请求伪造)

    CSRF(Cross Site Request Forgery, 跨站域请求伪造) CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的 ...

  3. 转: CSRF(Cross Site Request Forgery 跨站域请求伪造) 背景与介绍

    from:  https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/   在 IBM Bluemix 云平台上开发并部署您的下一个应用 ...

  4. CSRF(Cross Site Request Forgery, 跨站请求伪造)

    一.CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一.其他安全隐患, ...

  5. Flask restful API如何解决跨站请求问题

    如果像下面这样只是在return的response添加header是不行的: response = make_response(jsonify(response=get_articles(ARTICL ...

  6. SharePoint创建web application出现“The password supplied with the username was not correct”错误的解决方法

    平台环境 Windows Server 2012 R2 Standard, SharePoint Server 2010, Microsoft SQL Server 2012 (SP1) 问题描述 在 ...

  7. SharePoint 2013 图文开发系列之创建内容类型

    SharePoint内容类型,是很有特色的,就好比发布新闻,同在一张列表里,可以由内容类型区分图片新闻.文字新闻等,顾名思义,就是在一张列表里发布不同类型的项目. 1.添加新项目,选择SharePoi ...

  8. MySQL里创建外键时错误的解决

    --MySQL里创建外键时错误的解决 --------------------------------2014/04/30 在MySQL里创建外键时(Alter table xxx add const ...

  9. Office365学习笔记—Lookup类型加载条目过多解决方案

    1,随着接触的项目越来越多,遇到的各种奇葩的问题也越来越多,不得不说,SharePoint是个好东西,提高了开发效率,简化了很多基础的功能.但是令人头疼的问题是,当你想做个稍微复杂点的功能,就不得不研 ...

随机推荐

  1. JS获取当前/指定URL参数

    方法: 首先通过 document.location 获得当前访问网页的网址, 其次用 split 方法通过“?”把网址分为两部分. 如果网址中有参数(arrObj.length > 1) 再用 ...

  2. Android 之 SharedPreferences应用

    Android 平台给我们提供了一个 SharedPreferences 类,它是一个轻量级的存储类,特别适合用于保存共享数据.使用SharedPreferences保存数据,其背后是用xml文件存放 ...

  3. 【树莓派】Squid代理以及白名单配置

    Squid安装: sudo apt-get install squid3 -y 首先,建议备份一下这个配置文件,以免配错之后,无法恢复,又得重新安装: sudo cp /etc/squid3/squi ...

  4. vsphere产品下载列表

    https://my.vmware.com/cn/web/vmware/info/slug/datacenter_cloud_infrastructure/vmware_vsphere_with_op ...

  5. C++ 第九课 标准c数学函数

    abs() 求绝对值 acos() 求反余弦 asin() 求反正弦 atan() 求反正切 atan2() 求反正切,按符号判定象限 ceil() 求不小于某值的最小整数 (求上界) cos() 求 ...

  6. java导出excel工具类

    java导出excel须要使用HSSFWorkbook这个类,须要导入poi-3.6-20091214.jar 工具类调用例如以下: package com.qlwb.business.util; i ...

  7. yii框架的部署方法

    yii框架(yii framework)的部署方法 刚開始学习的人来说,部署yii框架还是有一定难度的,Yii是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web ...

  8. 〖Android〗Nexus 7 flo (razor) 刷入Recovery/CM-11.0后卡在开机动画的解决方法

    操作日志: 起因:Nexus 7 flo 华硕平板,刷了一个CWM Recovery之后变成了砖机: 尝试1:使用CWM Recovery清除数据,开机失败 尝试2:刷入CM 11 Snapshot的 ...

  9. Flink流处理之迭代案例

    当前Flink将迭代的重心集中在批处理上,之前我们谈及了批量迭代和增量迭代主要是针对批处理(DataSet)API而言的,而且Flink为批处理中的迭代提供了针对性的优化. 可是对于流处理(DataS ...

  10. ViewPager实现无限循环

    引言 这两天在项目里实用到ViewPager来做广告运营位展示.看到如今非常多APP的广告运营位都是无限循环的,所以就研究了一下这个功能的实现. 先看看效果 从一个方向上一直滑动.么有滑到尽头的感觉. ...