首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ObjectDataSource.SelectMethod中使用全局变量?

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

Stack Overflow用户
提问于 2010-09-10 17:03:24
回答 4查看 3K关注 0票数 5

我使用的是ListView + DataPager + ObjectDataSource混合。

在实现SelectMethod的ObjectDataSource中,我希望访问PageLoad()事件中的全局变量集(该方法将只返回每页适当的项目数)。尽管变量是在PageLoad()中初始化的,但在SelectMethod中它似乎是空的。我怎么才能改变呢?

代码语言:javascript
复制
    <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>
代码语言:javascript
复制
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
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-10 17:28:25

这是对象数据源的一个常见问题。你必须永远记住这一点:

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

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

如果您确实需要这样做,请使全局变量保持静态。

代码语言:javascript
复制
protected **static** SearchOption search; 

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

以下是MSDN引用:

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

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

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

票数 9
EN

Stack Overflow用户

发布于 2011-01-04 15:57:15

我也有同样的问题,但我找到了解决办法。

也可以用VB代码处理以下事件

代码语言:javascript
复制
 Protected Sub PagingDataSource_ObjectCreating(ByVal sender As Object, ByVal e As ObjectDataSourceEventArgs) Handles PagingDataSource.ObjectCreating
        e.ObjectInstance = Me
    End Sub

通过这种方式,您将定义类的当前实例和整个his变量。这是一项工作,我从自己身上进行了测试。还为ODS定义metod的名称

代码语言:javascript
复制
<asp:ObjectDataSource ID="PagingDataSource"    OnObjectCreating="PagingDataSource_ObjectCreating" 
票数 6
EN

Stack Overflow用户

发布于 2010-09-10 17:21:04

ASP.NET页面生命周期可能是在数据源初始化之后发生的Page_Load。尝试使用早期事件,如Page_Init或Page_PreInit。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3686644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档