SPList实例成员抛出NullReferenceException

时间:2013-11-12 14:58:42

标签: sharepoint design-patterns nullreferenceexception splist

短篇小说真正简短...我有一个类(在我的示例场景中它是一个应用程序页面),它包含对SPList的引用。

public partial class ApplicationPage1 : LayoutsPageBase
{
    private static SPList _list = GetSPList();

    private static SPList GetSPList()
    {
        try
        {
            return SPContext.Current.Web.GetList("/Lists/CoreConfiguration");
        }
        catch (FileNotFoundException)
        {
            return null;
        }
    }

    protected void BtnRunQuery_OnClick(object sender, EventArgs e)
    {
        Debug.WriteLine(_list.Author.Name);
    }
}

有趣的是显然是按钮点击事件。因为第一次始终有效。也许如果你很幸运,它可以在第二次或第三次工作。但它几乎从不工作第四次,它会抛出NullReferenceException。抛出异常的列表本身并不是该类的一些成员。显然,SPList对象比活着更死。

显然,保持对SPList的引用并不是一个好主意。 是否遵循设计模式,每次都去获取列表?在每个请求?

1 个答案:

答案 0 :(得分:1)

不,在SPList字段中保留static个实例并不是最好的主意。事实上,你可能不这样做。正如SPContext.Current的名称所示,它是非常具体的时间点的当前上下文。简而言之(简化),它是特定于请求的,并且SPList实例也是如此。

每次需要时都必须检索一个新的SPList实例。在内部,它与SPWeb实例绑定,对于它来说它是相同的 - 它不能在请求中存活。这里的经验法则是:如果您只有一个静态SPList实例,您将如何区分不同用户的权限?


旁注:它为第一个请求起作用的原因很简单:当第一次使用时,CLR会初始化您的类,这显然是在第一个请求期间。然后CRL调用class'es静态构造函数,它计算静态成员的值,并且由于SPContext.Current在那时是有效的,所以它接缝起作用。