【问题标题】:Accessing SPLIstItem properties in SharePoint在 SharePoint 中访问 SPLIstItem 属性
【发布时间】:2015-10-28 21:21:40
【问题描述】:

我正在尝试一些非常简单的方法 - 访问我的 SharePoint 列表的项目及其属性。

但是,对于所有普通列表,SPListItem.Properties 计数为零。对于文档和页面库,一切都按预期工作。因此,如果列表项是基于文档类型的,那么一切都很好。如果它们基于项目,则不返回属性。

我在两种环境中进行了尝试,一种是使用 OOTB 发布模板创建的新网站,一种是基于 OOTB 内容类型的新列表等等。总是一样的。

总是返回正确数量的 SPListItems。标题和名称都很好。只是 .Properties 哈希表完全是空的。

无奈之下,我编写了一个 Web 部件,输出以下(丑陋!)诊断信息。

    foreach (SPList list in SPContext.Current.Web.Lists)
    {
        foreach (SPListItem item in list.Items)
        {
            Label label = new Label();
            label.Text = "Name: " + item.Name + "Property count: " + item.Properties.Count;
            this.Controls.Add(label);
        }
    }

唯一的观察是它的工作原理与我之前描述的完全一样。我只是分享代码来证明这是可以想象的最基本的操作。

这是示例输出 - 为了便于阅读,我添加了换行符 ;-)

Name: Test Property count: 0
Name: default.aspx Property count: 21 

显然项目“测试”是一个基于项目的列表项,而 default.aspx 是一个页面。

有没有人遇到过这样的事情?有什么想法吗?

【问题讨论】:

    标签: sharepoint


    【解决方案1】:

    item["FieldName"] 是获取 SharePoint 列表中元数据列值的规范方法。如果您需要获取 SharePoint 列表的可用字段列表,请检查父 SPList 对象的 Fields 属性,该属性是此列表中字段的集合。这些字段对象中的每一个都有一个名为 InternalName 的属性,当您使用 SPListItem 的实例时,您应该使用它来访问其值。

    【讨论】:

      【解决方案2】:

      您是否要获取字段值?遗憾的是,它们不是强类型:

      string ModifiedBy = (string)item["Author"];
      

      要获取字段的正确名称(它们必须是内部名称),请转到列表,然后转到列表设置。您将在那里找到列列表。单击任何列名称以转到编辑页面,然后查看浏览器地址栏中的 URL。最后,应该有一个参数“Field=Editor”或类似的 - 这是您的内部字段名称。

      如果您想知道为什么像“测试字段”这样的字段看起来很奇怪,那是因为 Sharepoint 对某些字符进行了编码。空格将被编码为 x0020,因此“测试字段”的内部名称为“Test_x0020_Field”。

      为了获得正确的字段类型以转换为:

      string FieldType = item["Author"].GetType().FullName;
      

      (Visual Studio 中的中间窗口对此非常有帮助!)

      【讨论】:

      • 感谢您的想法,迈克尔。可悲的是,我的问题是 SPListItem.Properties 哈希表是完全空的。如果项目不是基于文档,则没有任何内容。我已经通过使用 Visual Studio 调试器验证了这一点。
      • 你需要什么.Properties HashTable?如果您想访问任何字段,则根本不需要它。仅适用于元数据,简单列表项通常没有元数据。
      • 如果我看例如一个页面类型的项目,我在属性哈希表中看到以下内容:键(我的字段名称)和值(字段的值)。然后我访问您的示例中的值:item [“fieldname”]。当我尝试访问不在 Properties 表中的字段值时,我得到一个异常。
      • 您是否检查过该字段是否正确访问?即,当您在浏览器中打开列表并选择设置 => 列表设置时,是否列出了所需的列?如果是,您是否使用正确的内部名称访问它?
      【解决方案3】:

      我发现 SPListItem 类的以下扩展非常有用。

      internal static class SharePointExtensions
      {
          internal static Dictionary<string, object> PropertiesToDictionary(this SPListItem item)
          {
              // NOTE: This code might be temping - but don't do it! ...itdoes not work as there are often multiple field definitions with the same Title!
              // return item.Fields.Cast<SPField>().ToDictionary(fld => fld.Title, fld => item[fld.Title]);
      
              Dictionary<string, object> dict = new Dictionary<string, object>();
              var fieldNames = item.Fields.Cast<SPField>().Select(fld => fld.Title).Distinct().OrderBy(sz => sz).ToArray();
              foreach (fieldName in fieldNames)
                  dict.Add(sz, item[fieldName]);
              return dict;
          }
      }
      

      有了它,你可以简单地做到:

      item.PropertiesToDictionary()
      

      ...你会得到一个很好的 Linq 字典对象,它会按照你期望的方式工作。是不是有点重量级/低性能?当然。大多数人愿意做出这种权衡吗?我想是的……

      【讨论】:

        【解决方案4】:

        您在设置属性后运行 SPListItem.Update() 还是 .SystemUpdate()?

        【讨论】:

        • 不...但我不想设置任何东西。我想阅读属性,但不幸的是哈希表完全是空的。没有一个单一的属性可供访问。
        【解决方案5】:

        如果您想从 SPListItem 的 SPField 中获取对象,您必须这样做:

        SPField field = ((SPList)list).Fields.GetField("FieldName"); 
        object fieldValue = field.GetFieldValue(((SPListItem)item)[field.Title].ToString());
        

        【讨论】:

          【解决方案6】:

          ListItem.Properties 哈希表将为空,除非您分配给它。

           SPListItem item = properties.ListItem;
           item.Properties["Key"] = "value";
          
           int total = item.Properties.Count;
          

          回答: “总计 == 1”

          【讨论】:

            【解决方案7】:
             SPList yourList = web.Lists["Your list name"];
             string sColumnValue = oSPListItem[yourList.Fields["yourSiteColumn display   
              name"].InternalName].ToString();
            

            【讨论】:

            • 不要只是转储代码作为答案,还要解释为什么这会回答这个问题,特别是如果你回答了一个已经有多个答案的 5 年前的问题。
            猜你喜欢
            • 2015-07-23
            • 1970-01-01
            • 1970-01-01
            • 2011-02-08
            • 2011-03-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多