当我尝试:
using (SPWeb web = site.OpenWeb("/"))
{
SPList list = web.Lists["Blah"];
SPView view = web.GetViewFromUrl("http://foo.com/Lists/Blah/View%20Name.aspx");
foreach (SPListItem item in list.GetItems(view))
{
writer.write(item.Title);
}
}
item.Title让我得到一个ArgumentException。
但是当我使用
时foreach (SPListItem item in list.Items)
{
writer.write(item.Title);
}
它运作得很好。
这里发生了什么?在传递视图时,如何获取列表项的标题?
答案 0 :(得分:9)
检查您的视图定义。 “标题”是视图定义中包含的字段之一吗?
在您的第一个代码段中,您将根据视图过滤列表中的项目。在第二个代码段中,您直接从列表中访问项目而不进行过滤。
顺便说一句:循环使用list.Items是一个坏主意。遗憾的是,在SharePoint中实现此属性会导致它在循环的每次迭代中从数据库中检索项目。此代码是首选且等效的:
SPListItemCollection listItems = list.Items;
foreach (SPListItem item in listItems)
{
...
}
答案 1 :(得分:1)
这是SPView对象与GetItems连接的共享错误。当您从列表中检索视图时,例如:list.Views [“View Name”] ViewFields只包含两个字段(Title,LinkTitle),并且检索到的视图的SPQuery为空。如果您想过滤列表项或通过SPQuery类获取字段。
此外,您还希望获得GetItems(spView)方法的工作状态。您可以重置HttpContext,然后尝试获取spView。
例如:
private SPListItemCollection GetItemsByEventType()
{
HttpContextHelper.ResetCurrent();
SPList list;
try
{
SPWeb web = Context.Site.OpenWeb(Context.Web.ID);
try
{
list = web.Lists[ListName];
}
catch (Exception)
{
list = web.GetListFromUrl(ListName);
}
if (!String.IsNullOrEmpty(ListViewName))
{
SPView view = list.Views.Cast<SPView>()
.Where(t => t.Title == ListViewName)
.FirstOrDefault();
return list.GetItems(view);
}
} finally
{
HttpContextHelper.RestoreCurrent();
}
return list.Items;
}
protected new SPContext Context
{
get { return SPContext.GetContext(base.Context); }
}
public class HttpContextHelper
{
#region Fields
[ThreadStatic]
private static HttpContext _current;
#endregion
#region Methods
public static void ResetCurrent()
{
if (_current != null)
{
throw new InvalidOperationException();
}
_current = HttpContext.Current;
HttpContext.Current = null;
}
public static void RestoreCurrent()
{
HttpContext.Current = _current;
_current = null;
}
#endregion
}