设为首页 收藏本站
查看: 553|回复: 0

[经验分享] SharePoint 创建 Lookup 类型的Site Column解决跨站问题

[复制链接]

尚未签到

发表于 2015-9-25 11:55:34 | 显示全部楼层 |阅读模式
  在某些情况下,我们需要去引用其他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:
DSC0000.png


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


  • 点击创建:
DSC0002.png


  • 创建Lookup(查阅项)类型的Column,并为其选择信息来源:
DSC0003.png
  
  接着,就可以在子站中使用该Column,同理进入子站,打开Employee List,点击列表设置,为其添加Column:
DSC0004.png
  在相应的组中找到自定义的Lookup类型的Column,点击添加即可:
DSC0005.png
  这样就可以在跨站引用其他List中的数据了:
DSC0006.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,发现其信息来源这儿压根没有设置上去:
DSC0007.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();
}
}
}
}
}
}

  • 我们到网站设置下查看以下是否已经正确设置了信息来源:
DSC0008.png


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

总结

  源代码点击下载。

  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-118660-1-1.html 上篇帖子: SharePoint 2010 各个常用级别对象的获取 下篇帖子: K2与SharePoint 2003集成特征
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表