如何在ObjectDataSource.SelectMethod中使用全局变量?

时间:2010-09-10 17:03:24

标签: c# asp.net

我正在使用ListView + DataPager + ObjectDataSource组合。

在ObjectDataSource的SelectMethod的实现中,我想访问PageLoad()事件中设置的全局变量(该方法将返回每页的正确数量的项目)。尽管变量在PageLoad()中初始化,但在SelectMethod中似乎为null。我怎么能改变它?

    <asp:ObjectDataSource ID="ItemsObjectDataSource" runat="server" EnablePaging="True"
                        SelectMethod="WrapSearchResults" SelectCountMethod="CountSearchResults"
                        TypeName="Catalogue">
                        <SelectParameters>
                            <asp:QueryStringParameter Name="startRowIndex" QueryStringField="page" Type="Int32" DefaultValue="0" />
                            <asp:Parameter Name="maximumRows" Type="Int32" DefaultValue="10" />
                        </SelectParameters>
    </asp:ObjectDataSource>

SearchOption search;
protected void Page_Load(object sender, EventArgs e)
{
    search = new SearchOption(SessionParameters.Get(Session).User);
}

public IEnumerable<ResultWrapper> WrapSearchResults(int startRowIndex, int maximumRows)
{
    search.Limit = maximumRows; <-- null pointer exception
}

4 个答案:

答案 0 :(得分:9)

这是对象数据源的常见问题。你总是要记住这个:

ODS将通过 Reflection 调用指定的方法,而不是对象的特定实例。 (除非您指定要自己使用的实例)

该值为null,因为ODS直接调用了该方法,并且它从未成为asp.net页面生命周期的一部分。

如果您确实需要这样做,请将全局变量设为STATIC。

protected **static** SearchOption search; 

如果您查看堆栈跟踪,就在空异常之前,您应该看到框架反射调用。这应该会让你知道发生了什么!

以下是MSDN参考:

http://msdn.microsoft.com/en-us/library/ms227436.aspx

如果对象具有实例方法而不是静态方法,则ObjectDataSource控件将创建源对象的实例,调用指定的方法,并在单个请求的范围内处置对象实例(共享)在Visual Basic中)。因此,您的对象必须是无状态的。也就是说,您的对象应该在单个请求的范围内获取并释放所有必需的资源。

您可以通过处理ObjectDataSource控件的ObjectCreating事件来控制源对象的创建方式。您可以创建源对象的实例,然后将ObjectDataSourceEventArgs类的ObjectInstance属性设置为该实例。 ObjectDataSource控件将使用在ObjectCreating事件中创建的实例,而不是自己创建实例。

答案 1 :(得分:7)

我有同样的问题,但我找到了解决方案。

或者你可以在VB代码中处理follow事件

 Protected Sub PagingDataSource_ObjectCreating(ByVal sender As Object, ByVal e As ObjectDataSourceEventArgs) Handles PagingDataSource.ObjectCreating
        e.ObjectInstance = Me
    End Sub

通过这种方式,您将定义您的类的当前实例和整个变量。这是我自己测试的工作。还要为ODS定义metod的名称

<asp:ObjectDataSource ID="PagingDataSource"    OnObjectCreating="PagingDataSource_ObjectCreating" 

答案 2 :(得分:0)

ASP.NET page lifecycle可能是在数据源初始化后发生Page_Load。尝试使用较早的事件,例如Page_Init或Page_PreInit。

答案 3 :(得分:0)

您还可以尝试对象数据源的OnSelect事件,并从代码隐藏处发送相应的参数