在SharePoint中访问SPLIstItem属性

时间:2009-03-15 13:26:34

标签: sharepoint

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

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

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

始终返回正确数量的SPListItems。标题和名称都没问题。只是.Properties哈希表完全是空的。

在绝望中,我写了一个网页部分,输出以下(丑陋的!)诊断。

    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 

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

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

7 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

您是否想要获得字段值?可悲的是,他们没有强烈的打字:

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

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

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

为了获得适当的字段类型要转换为:

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

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

答案 2 :(得分:1)

我发现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字典对象,它将按照你期望的方式工作。它有点重量级/低性能吗?当然。大多数人都愿意做出这种权衡吗?我想是的......

答案 3 :(得分:0)

设置属性后是否运行SPListItem.Update()或.SystemUpdate()?

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

除非您为其分配,否则ListItem.Properties哈希表将为空。

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

 int total = item.Properties.Count;

答案:      &#34;总计== 1&#34;

答案 6 :(得分:-1)

 SPList yourList = web.Lists["Your list name"];
 string sColumnValue = oSPListItem[yourList.Fields["yourSiteColumn display   
  name"].InternalName].ToString();