计算新的内容类型字段

时间:2014-05-15 11:33:44

标签: c# sharepoint visual-studio-2013 sharepoint-2013 external-contenttype

这是我多年来为我的问题找到解决方案之后的第一篇文章。 我是SharePoint的新手,虽然不是一个完整的初学者。

这是我想要实现的目标:

  • 我想创建一个由用户填写的列表
  • 此列表将包含标识符文本字段,我们称之为strId
  • 此列表必须包含一个字段,该字段是使用strId作为参数从oracle数据库检索的值

我已经做了一些BDC模型,但这似乎有所不同,因为列表元素不是来自数据库,只有一列。

我考虑过创建一个包含2个网站列的内容类型,一个用strId,另一个用于计算,但我似乎无法做到。

有人可以帮忙解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我建议如下:

  • 创建外部内容列表:(例如:T_Investigator)
  • 创建新的自定义列表(例如:ExternalDisplay)
  • 将您的strid添加为单行文本
  • 将外部内容列表添加为查找(例如:external_id),并添加您希望查看的字段(例如:firstname,lastname)
  • 使用带有onAdding / onUpdating的事件接收器为ExternalDisplay列表创建一个sharepoint解决方案。在添加/更新时,您可以使用strid
  • 中的新值覆盖'external_id'字段

代码:

using Microsoft.SharePoint;

namespace SOEventReceiver.ExternalTest
{
    public class ExternalTest : SPItemEventReceiver
    {
        public override void ItemAdding(SPItemEventProperties properties)
        {
            string strid = (properties.AfterProperties["strid"] ?? string.Empty).ToString();
            if (!string.IsNullOrWhiteSpace(strid))
            {
                properties.AfterProperties["external_id"] = strid + ";#" + strid;
            }
            base.ItemAdding(properties);
        }

        public override void ItemUpdating(SPItemEventProperties properties)
        {
            string strid = (properties.AfterProperties["strid"] ?? string.Empty).ToString();
            if (!string.Equals(strid, properties.ListItem["strid"] ?? string.Empty))
            {
                properties.AfterProperties["external_id"] = strid + ";#" + strid;
            }
            base.ItemUpdating(properties);
        }
    }
} 

使用elements.xml指向列表的网址

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Receivers ListUrl="Lists/ExternalDisplay">
      <Receiver>
        <Name>ExternalTestItemAdding</Name>
        <Type>ItemAdding</Type>
        <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
        <Class>SOEventReceiver.ExternalTest.ExternalTest</Class>
        <SequenceNumber>10000</SequenceNumber>
      </Receiver>
      <Receiver>
        <Name>ExternalTestItemUpdating</Name>
        <Type>ItemUpdating</Type>
        <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
        <Class>SOEventReceiver.ExternalTest.ExternalTest</Class>
        <SequenceNumber>10000</SequenceNumber>
      </Receiver>
  </Receivers>
</Elements>

Sharepoint自动进行更改,因为Lookupfield值已更改,并显示外部列。

这里的优势在于sharepoint可以完成主要的魔术,在这个(外部/共享点)后面的查找列表也无关紧要。

缺点是external_id字段也可能被更改,这不会更新strid字段,并且您将获得不一致的数据。但是,您也可以在更新语句中阻止