我正在尝试一些非常简单的事情 - 访问我的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是一个页面。
有没有人遇到过这样的事情?有什么想法吗?
答案 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();