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

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

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

最佳答案

这是对象数据源的常见陷阱。您始终必须记住以下几点:

ODS将通过反射而不是对象的特定实例来调用指定的方法。
(除非您指定要使用的实例)

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

如果确实需要执行此操作,请使全局变量为STATIC。

protected **static** SearchOption search;

如果您查看堆栈跟踪,那么在null异常之前,您应该会看到框架反射调用。那应该告诉您发生了什么事!

这是MSDN引用:

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

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

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

关于c# - 如何在ObjectDataSource.SelectMethod中使用全局变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3686644/

10-11 13:18