这是我多年来为我的问题找到解决方案之后的第一篇文章。 我是SharePoint的新手,虽然不是一个完整的初学者。
这是我想要实现的目标:
我已经做了一些BDC模型,但这似乎有所不同,因为列表元素不是来自数据库,只有一列。
我考虑过创建一个包含2个网站列的内容类型,一个用strId,另一个用于计算,但我似乎无法做到。
有人可以帮忙解决这个问题吗?
答案 0 :(得分:0)
我建议如下:
代码:
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字段,并且您将获得不一致的数据。但是,您也可以在更新语句中阻止