SPList.GetItems(view)在尝试获取项目标题时返回异常

时间:2009-06-10 17:10:06

标签: c# sharepoint

当我尝试:

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);
}

它运作得很好。

这里发生了什么?在传递视图时,如何获取列表项的标题?

2 个答案:

答案 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
}