专栏首页木宛城主SharePoint 创建 Lookup 类型的Site Column解决跨站问题

SharePoint 创建 Lookup 类型的Site Column解决跨站问题

在某些情况下,我们需要去引用其他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中的数据,这将为我们今后在项目中可以重用这个字段提供了方便:

总结

源代码点击下载。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SharePoint 2013 创建 Site Collection

    在之前的文章中,通过SharePoint Central Administration 创建了Web Application。在这篇文章中将继续SharePo...

    用户1161731
  • 你必须掌握的一些常见的SQL语句,包含单表查询、高级查询(连接查询、复合条件查询、嵌套查询)

    分享一些常见的SQL语句,包含单表查询、高级查询(连接查询、复合条件查询、嵌套查询等)。 --建立学生信息表Students create table Stud...

    用户1161731
  • SharePoint 2013 Step by Step—— 为终端用户提供故障恢复的解决方案 Part I

    Disaster Recovery,我把他直译"故障恢复",或者也可以翻译成 "灾难复原 "。光字面意思就可以领会到,当SharePoint Server发生了...

    用户1161731
  • 【工具】图像处理调试工具(附工具下载!)

    在图像处理时,我们可能需要实时进行调试,有时候需要知道图像每个像素的具体值来帮助我们验证算法的准确性和理解算法思路。 在不同情况下,我们需要使用 Pytho...

    机器视觉CV
  • 如何禁用Kerberos

    在Hadoop集群内提供身份认证最佳和可接受的方式是使用Kerberos。Kerberos提供了强大的身份验证功能,但是它的复杂性也让很多集群管理员心生畏惧。而...

    soundhearer
  • win10锁屏界面无法更新

    Jetpropelledsnake21
  • 如何使用Xshell连接腾讯云服务器?

    如何使用Xshell连接腾讯云服务器?很多新手不知道如何链接 linux服务器。下面赵一八笔记给大家分享如何使用Xshell连接腾讯云服务器?

    用户7261497
  • 腾讯云:聚焦云变革下的生态圈 降价、扶持用意何在?

    不知什么时候开始,云服务这个概念悄然进入中国,国内云服务产业,正在以一种前所未有的速度发展、变革并定型,随着互联网技术日趋发展、设备不断完善,这样的产业格局也在...

    静一
  • 基于深度学习方法可加快生成更清晰且逼真的图像

    蒙特卡罗计算方法是游戏和电影中生成的许多逼真图像的基础。它自动模拟复杂的灯光和相机物理,从不同的图像特征和场景的样本生成高质量的效果图。但是渲染的过程很慢,可能...

    AiTechYun
  • 一文囊括图像处理25个高频考点

    从非结构化数据中提取有用的信息一直是研究界极为关注的话题。图像就是一种这样的非结构化数据,图像数据分析在商业的各个方面都有应用。

    AI算法与图像处理

扫码关注云+社区

领取腾讯云代金券