我建议如下:
- 创建外部内容列表:(例如:T_Investigator)
- 创建新的自定义列表(例如:ExternalDisplay)
- 将您的 strid 添加为单行文本
- 添加外部内容列表作为查找(例如:external_id),并添加您希望查看的字段(例如:名字,姓氏)
- 使用带有 onAdding/onUpdating 的事件接收器为 ExternalDisplay 列表创建共享点解决方案。添加/更新时,您可以使用 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 指向您的列表的 url
<?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>
由于 Lookupfield 值已更改,Sharepoint 会自动进行更改,并显示外部列。
这里的优点是 sharepoint 具有主要的魔力,它背后的查找列表(外部/sharepoint)也无关紧要。
一个缺点是 external_id 字段也可以更改,这不会更新 strid 字段,并且您会得到不一致的数据。但是,您也可以在更新语句中阻塞