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,