Tip: Usar un control de otro Content como parametro en un DataSource

El título esta un poco largo, pero es puntual para lo que trata en este post.

Recuerden que en ASP.NET 2.0++ tenemos los famosos controles DataSource, ObjectDataSource, y los demás…

Todos estos controles son parametrizables, por ejemplo si mapeo mi ObjectDataSource a un método getMany (que devuelve una lista de generic del tipo de productos:

   1: [DataObjectMethod(DataObjectMethodType.Select, true)]
   2: public static List<Product> getManyByCustomRepository(
   3:                String model, String description,             
   4:              Int32 startRowIndex, Int32 maximumRows, String sortExpression)
   5: {
   6:      BLProductCustom blProd = new BLProductCustom();         
   7:  
   8:      return blProd.GetManyRepository(model, description,
   9:                    startRowIndex, maximumRows,
  10:                    sortExpression);
  11: }

El wizard me pide mapear los parámetros del método, con parámetros en mi página que puede ser por Control, QueryString, entre otras. Los tres últimos parámetros son para la paginación personalizada (que requiere un método contar para el ObjectDataSource), y el otro es para el Sort. Estos parámetros deben ser eliminados cuando el Wizard los mapea…

Ahora el código que tiene el ObjectDataSource es, como pueden ver estoy mapeando los parámetros a controles:

   1: <asp:ObjectDataSource ID="odsSearchProducts" runat="server" EnablePaging="True" 
   2:        OldValuesParameterFormatString="original_{0}"
   3:        SelectCountMethod="getCountByCustomRepository" SelectMethod="getManyByCustomRepository"
   4:        TypeName="ABC.AgProductUpload" OnSelecting="odsSearchProducts_Selecting" 
   5:        SortParameterName="sortExpression">
   6:     <SelectParameters>     
   7:         <asp:ControlParameter ControlID="txtModel" Name="model" PropertyName="Text"
   8:                        Type="String" />       
   9:         <asp:ControlParameter ControlID="txtDescription" Name="description" 
  10:                        PropertyName="Text" Type="String" />                
  11:     </SelectParameters>
  12: </asp:ObjectDataSource>

El caso es que ahora he tenido que mover los controles de filtro a otro control Content de ASP.NET, por temas de layout. Y pues venía el problema que no se reconoce los controles al ejecutar la página:

“Could not find control ‘txtModel in ControlParameter ‘model’.”

Y pues la solución es simple, (y no hay hacer ninguna marcianada en los eventos de selecting), sólo hay que cambiar el nombre de referencia:

   1: <asp:ObjectDataSource ID="odsSearchProducts" runat="server" EnablePaging="True" 
   2:        .... >
   3:     <SelectParameters>     
   4:         <asp:ControlParameter 
   5:                ControlID="ctl00$ctl00$placeSearchTop$placeSearch$txtModel" 
   6:                Name="model" PropertyName="Text" Type="String" />
   7:         <asp:ControlParameter 
   8:                ControlID="ctl00$ctl00$placeSearchTop$placeSearch$txtDescription" 
   9:                Name="description" PropertyName="Text" Type="String" />
  10:     </SelectParameters>
  11: </asp:ObjectDataSource>

Y eso…, el nombre depende de la estructura del uso del ContePlaceHolder que tengan, nada que no se puede ver haciendo un “View in Browser“, y ver el código html para ver el nombre completo de los controles.

Fuente: ASP.NET: could not find Control in ControlParameter.

Saludos,

4 comentarios en “Tip: Usar un control de otro Content como parametro en un DataSource”

  1. Así es, normalmente cuando estan dentro del mismo contenedor (los dos están dentro del Content01), no hay problema basta con solo colocar los nombres de los controles, es más el wizard, te las opciones de hacerlo directo. Pero cuanto están en distinto nivel, (también puede ser que el control este dentro de un formView, y el control dataSource fuera del formView), en ese caso al igual que estén en disintto content, no se reconerán los controles, y es ahí cuando resulta usar el nombre completo (es decir incluyendo el nombre del contenedor, sea un content o un formview).

    Por que lo otro sería pasarle programaticamente el contenido del control, pero poniendo el nombre completo, se obvia esta tarea.

    Saludos,

  2. Pero como se puede hacer esto mediante codigo c#, es decir con el objeto ControlParameter y el metodo SelectParameters de ObjectDataSource?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *