c# - repetidores - ¿Es posible pasar un valor al método Select de un repetidor?
repetidor wifi por cable ethernet (4)
Eche un vistazo al Ejercicio 1: Enlace de modelo en formularios web ASP.NET -> Tarea 3 - Proveedores de valor en el tutorial de enlace de modelo .
Es posible definir algún tipo de parámetro de selección de control dentro de la firma SelectMethod.
ASP.Net 4.5 presenta nuevas formas de enlazar datos a controles como el Repeater a través de la propiedad SelectMethod:
<asp:Repeater runat="server" ItemType="MyData.Reference"
SelectMethod="GetReferences">
llama al método Codebehind
public IEnumerable<Reference> GetReferences()
En el escenario de repetidores anidados, ¿es posible pasar un parámetro a este método de selección de alguna manera, de modo que obtenga diferentes datos dependiendo del elemento del repetidor externo?
Ejemplo:
<asp:Repeater runat="server" ItemType="MyData.Reference"
SelectMethod="GetReferences(Item.ID)">
debería estar llamando
public IEnumerable<Reference> GetReferences(int id)
Sé que esto se puede lograr a través de los eventos de ItemDataBound, pero me gustaría utilizar la sintaxis mucho más simple y limpia de SelectMethod y ItemType.
¿El SelectMethod permite que el parámetro pase de alguna manera?
Si no, ¿hay alguna otra forma limpia de obtener el valor del artículo repetidor externo dentro de mi SelectMethod?
Mientras esperaba respuestas, jugué un poco y encontré la siguiente solución.
Puede que no sea la mejor manera de hacerlo, pero hasta ahora no he encontrado problemas con eso y es bastante directo, así que lo lanzaré por ahí.
<asp:Repeater runat="server" ItemType="MyData.Reference"
DataSource=''<%# GetReferences(Item.ID) %>''>
Esencialmente, lo que hago aquí es reemplazar el SelectMethod
con DataSource
(Intellisense no lo sugerirá, pero funciona de todos modos).
De esta forma puedo pasar un valor al método GetReferences y luego usar el valor de retorno para el enlace del modelo.
Hasta ahora, esta es la solución más corta que encontré.
Puede usar proveedores de valor
Ejemplo:
public IQueryable<Category> GetCategories([Control]int? minProductsCount)
{
}
Esta es una lista de ValueProviders:
CompositeValueProvider . Representa un proveedor de valores cuyos valores proceden de una lista de proveedores de valor que implementa la interfaz
IEnumerable
.QueryStringValueProvider Representa un proveedor de valor para las cadenas de consulta que están contenidas en un objeto
NameValueCollection
.RouteDataValueProvider Representa un proveedor de valor para datos de ruta que está contenido en un objeto que implementa la
IDictionary(Of TKey, TValue)
.ControlValueProvider Representa un proveedor de valores para los valores de control.
CookieValueProvider Representa un proveedor de valor para los valores de cookie.
FormValueProvider Representa un proveedor de valor para los valores de formulario.
ProfileValueProvider Representa un proveedor de valor para los valores de perfil.
UserProfileValueProvider Representa un proveedor de valor para los perfiles de usuario.
ViewStateValueProvider Representa un proveedor de valores para ver los valores de estado.
Así es como lo haces:
En su repetidor externo, coloque un campo oculto y nombre un método de selección para el repetidor interno:
<asp:Repeater SelectMethod="GetTopLevelStuff">
<ItemTemplate>
<asp:HiddenField runat="server" ID="ItemId" Value="<%# Item.ID %>"/>
<asp:Repeater SelectMethod="GetSubItems">
<ItemTemplate>Template code for sub-items here</ItemTemplate
</asp:Repeater>
</ItemTemplate
</asp:Repeater>
Entonces, aquí está la magia no tan bien documentada:
public IQueryable<SubItem> GetSubItems([Control("ItemId")] int itemId)
{
return yourDataStore.GetSubItems(itemId);
}
El proveedor de valor en este caso también puede tomar un nombre de propiedad, útil al utilizar listboxes para obtener "SelectedValue".
Encontré tu pregunta, hice lo que tú hiciste, luego probé esta solución que funciona igual de bien pero es mucho más limpia y más según la idea del concepto, parece.