2010-09-10 11 views
5

Estoy usando la mezcla ListView + DataPager + ObjectDataSource.Cómo usar variables globales en ObjectDataSource.SelectMethod?

En la implementación de mi SelectMethod de ObjectDataSource me gustaría acceder a una variable global configurada en el evento PageLoad() (el método devolverá solo el número adecuado de elementos por página). Aunque la variable se inicializa en PageLoad(), parece ser nula en SelectMethod. ¿Cómo puedo cambiar eso?

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

Respuesta

9

Esto es un resultado común con el origen de datos de objeto. Siempre debe recordar esto:

El ODS llamará al método especificado a través de Reflection, no una instancia específica del objeto. (A menos que especifique la instancia de usar usted mismo)

El valor es nulo porque el ODS denomina método directo y nunca fue parte del ciclo de la página asp.net vida.

Si realmente necesita hacer esto, cree la variable global STATIC.

protected **static** SearchOption search; 

Si mira el rastro de la pila, justo antes de la excepción nula debería ver las llamadas de reflexión del marco. ¡Eso debería avisarte de lo que está pasando!

Aquí es la referencia de MSDN:

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

El control ObjectDataSource creará una instancia del objeto de origen, llame al método especificado, y disponer de la instancia de objeto todos dentro del alcance de un solo solicitud, si su objeto tiene métodos de instancia en lugar de métodos estáticos (Compartido en Visual Basic). Por lo tanto, su objeto debe ser apátrida. Es decir, su objeto debe adquirir y liberar todos los recursos requeridos dentro del lapso de una sola solicitud.

Puede controlar cómo se crea el objeto fuente al manejar el evento ObjectCreating del control ObjectDataSource. Puede crear una instancia del objeto de origen y luego establecer la propiedad ObjectInstance de la clase ObjectDataSourceEventArgs en esa instancia. El control ObjectDataSource usará la instancia que se crea en el evento ObjectCreating en lugar de crear una instancia por sí mismo.

+0

OH MY GOD! Muchos años y nunca corrió a ese problema. Pensé que la selección fue llamada después de 'pageRender', por eso fue nula ... ¡NO! Gracias DUDE !!! +1 xoxoxo – ppumkin

+0

@ppumkin ¡Me alegro de poder ayudar! – asawyer

0

El ASP.NET page lifecycle es, probablemente, de tal manera que Load está sucediendo después de la inicialización de la fuente de datos. Intente utilizar un evento anterior, como Page_Init o Page_PreInit.

0

También puede probar el evento onselect de la fuente de datos de objetos y enviar los parámetros adecuados del código subyacente no

7

que tenían el mismo problema, pero he encontrado solución.

O puede controlar el evento de seguimiento de código VB

Protected Sub PagingDataSource_ObjectCreating(ByVal sender As Object, ByVal e As ObjectDataSourceEventArgs) Handles PagingDataSource.ObjectCreating 
     e.ObjectInstance = Me 
    End Sub 

De esta manera va a definir la instancia actual de la clase que usted y toda su variables. Es un trabajo que lo probé por mi cuenta. Defina también el nombre del método para ODS

<asp:ObjectDataSource ID="PagingDataSource" OnObjectCreating="PagingDataSource_ObjectCreating"