gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:11:22 25 4
gpt4 key购买 nike

我正在混合使用 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; 

如果您查看堆栈跟踪,就在空异常之前,您应该会看到框架反射调用。这应该会提示您正在发生的事情!

这是 MSDN 引用:

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

如果您的对象具有实例方法而不是静态方法(共享在 Visual Basic 中)。因此,您的对象必须是无状态的。也就是说,您的对象应该在单个请求的范围内获取和释放所有必需的资源。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com