我通过客户端对象模型检索内容类型的FieldCollection:
var fields = contentType.Fields;
clientContext.Load(fields);
clientContext.ExecuteQuery();
然后我遍历字段并检查字段是否派生出来:
if (field.FromBaseType) { ... }
这适用于从“Item”派生的字段“Title”,但不适用于内容类型派生自其他自定义内容类型的字段。
为什么“{1}}对于”标题“字段是真的,而对于直接父内容类型的字段不是?如果派生了一个字段,我该怎么知道?
答案 0 :(得分:0)
正如Vadim所说,Field.FromBaseType属性仅表示该字段是否来自基本字段类型。它没有说明内容类型。
所以,我通过加载父内容类型的字段来解决我的问题,并检查它们是否包含具有相同ID的字段:
var fields = contentType.Fields;
var parentFields = contentType.Parent.Fields;
clientContext.Load(fields);
clientContext.Load(parentFields);
clientContext.ExecuteQuery();
foreach (var field in fields)
{
if (Enumerable.Any(parentFields, pf => pf.Id == field.Id))
{
// ...
}
}
但这有点粗糙......如果有人有更好的答案,我会乐意接受它。
答案 1 :(得分:0)
SPField.FromBaseType property获取一个布尔值,该值指示该字段是否源自基本字段类型,并且与确定该字段是否源自父内容类型不同。
以下方法演示了如何确定字段的源内容类型:
public static ContentType GetSource(Field field, ContentType contentType)
{
var ctx = field.Context;
var parentCt = contentType.Parent;
ctx.Load(parentCt);
ctx.Load(parentCt.FieldLinks);
ctx.ExecuteQuery();
var fieldLink = parentCt.FieldLinks.FirstOrDefault(fl => fl.Name == field.InternalName);
if (parentCt.StringId != "0x01" && fieldLink != null)
{
return GetSource(field, parentCt);
}
return (fieldLink == null ? contentType : parentCt);
}
用法
var fields = contentType.Fields;
ctx.Load(fields);
ctx.ExecuteQuery();
foreach (var field in fields)
{
var source = GetSource(field, contentType);
Console.WriteLine("Field: {0} Source: {1}",field.Title,source.Name);
}