我正在使用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/