检索元数据列字段

时间:2014-01-06 11:48:13

标签: c# sharepoint moss

我需要以编程方式检索Sharepoint文档库中的列,以便在Sharepoint外部设置文件属性。

我发现设置元数据属性并不难,只要你已经知道列的名称,我不能指望用户自己输入。

由于似乎无法通过Sharepoint Web Services执行此操作,因此我创建了自己的自定义Web服务,因此我可以访问客户端对象模型。

List Custom Columns

使用此代码,我可以检索自己创建的自定义列,但是我无法区分项目属性部分(上图)中可编辑的列和不可编辑的列。

SPList list = web.Lists[specificList];
foreach (SPField field in list.Fields)
{
    if (!field.Hidden)
    {
        var title = field.Title;
        var description = field.Description;
        var parentList = field.ParentList;

        var references = field.FieldReferences; // contains names of fields referenced in computed fields

        if (references != null)
        {
            foreach (string reference in references)
            {
                var test = parentList.Fields.GetField(reference);
            }
        }
    }
}

我获得了额外的属性,例如:

  • 复制来源
  • 内容类型
  • 签出
  • 签入评论
  • 输入
  • 文件
  • 尺寸
  • 修改
  • 版本
  • 源版本
  • 来源名称

我也尝试从SPFolder项中检索列字段,但这又返回了许多额外的属性,甚至更少可过滤。

foreach (SPListItem folderItem in list.Folders)
{
    SPFolder folder = folderItem.Folder;
    System.Collections.Hashtable oHashtable = folder.Properties;
    System.Collections.ICollection collKeys = oHashtable.Keys;

    foreach (var key in collKeys)
    {
        string keyName = key.ToString();
    }
}

是否有标准方法来检索我需要的列字段?或者我是否必须手动排除默认值,例如“Checked out to”?

2 个答案:

答案 0 :(得分:1)

首先,您必须知道您正在查看哪种表格。是EditForm还是NewForm?

您可以通过获取ContentType的字段来过滤特定表单上可见的列,然后检查它们是否显示在NewForm(或任何表单)上:

SPList list = web.Lists[specificList];
var contentType = list.ContentTypes[0]; // Select first contenttype. Change this if you need a different contentType
foreach (SPField field in contentType.Fields)
{
    if (!field.Hidden 
        && (field.ShowInEditForm == null
            || !field.ShowInEditForm.Value)) // Replace ShowInEditForm with the form you need
    {
        var title = field.Title;
        var description = field.Description;
        var parentList = field.ParentList;

        var references = field.FieldReferences; // contains names of fields referenced in computed fields

        if (references != null)
        {
            foreach (string reference in references)
            {
                var test = parentList.Fields.GetField(reference);
            }
        }
    }
}

答案 1 :(得分:0)

我认为最好的方法是从内容类型而不是列表本身获取字段。这样,您只能获得表单中可见的字段。

var list = web.Lists[specificList];
var contentType = list.ContentTypes["Document"];
foreach (SPField field in contentType.Fields)
{
    if(!field.Reorderable || contentType.FieldLinks[field.Id].Hidden)
    { 
        continue;
    }

    //Process fields
}

您可以问“为什么Reordable=false?”。好吧,通常自定义字段不设置此属性,因此它是一种很好的过滤方式。

我也没有发明这段代码。此代码取自SharePoint标准内容类型字段重新排序页面后面的代码(使用反射)。