虽然该字段是从另一种内容类型派生的,但CSOM Field.FromBaseType返回false

时间:2015-01-13 15:37:34

标签: sharepoint-2013 csom

我通过客户端对象模型检索内容类型的FieldCollection:

var fields = contentType.Fields;
clientContext.Load(fields);
clientContext.ExecuteQuery();

然后我遍历字段并检查字段是否派生出来:

if (field.FromBaseType) { ... }

这适用于从“Item”派生的字段“Title”,但不适用于内容类型派生自其他自定义内容类型的字段。

为什么“{1}}对于”标题“字段是真的,而对于直接父内容类型的字段不是?如果派生了一个字段,我该怎么知道?

2 个答案:

答案 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);
}