我正在使用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
}
答案 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事件,并从代码隐藏处发送相应的参数