Можно ли передать значение в SelectMethod ретранслятора?
В ASP.Net 4.5 представлены новые способы привязки данных к элементам управления, например Repeater, через свойство SelectMethod:
<asp:Repeater runat="server" ItemType="MyData.Reference"
SelectMethod="GetReferences">
вызывает метод Codebehind
public IEnumerable<Reference> GetReferences()
В сценарии вложенных повторителей можно каким-то образом передать параметр этому методу выбора, чтобы он извлекал разные данные в зависимости от элемента внешнего ретранслятора?
Пример:
<asp:Repeater runat="server" ItemType="MyData.Reference"
SelectMethod="GetReferences(Item.ID)">
должен вызывать
public IEnumerable<Reference> GetReferences(int id)
Я знаю, что это может быть достигнуто с помощью событий ItemDataBound, но я хотел бы использовать гораздо более простой и понятный синтаксис SelectMethod и ItemType.
Позволяет ли метод SelectMethod каким-либо образом передавать параметр?
Если нет, существует ли еще один чистый способ получить значение из внешнего элемента Repeater в моем методе SelectMethod?
Ответы
Ответ 1
В ожидании ответов я немного поиграл и нашел следующее решение.
Это может быть не лучший способ сделать это, но до сих пор у меня не было проблем с этим, и это довольно сложно, поэтому я просто выброшу его там.
<asp:Repeater runat="server" ItemType="MyData.Reference"
DataSource='<%# GetReferences(Item.ID) %>'>
По сути, я здесь заменяю SelectMethod
на DataSource
(Intellisense не предложит его, но он тем не менее работает).
Таким образом, я могу передать значение методу GetReferences и затем использовать возвращаемое значение для привязки к модели.
Пока это кратчайшее решение, с которым я столкнулся.
Ответ 2
Вот как вы это делаете:
В своем внешнем ретрансляторе поместите скрытое поле и назовите selectmethod для внутреннего ретранслятора:
<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>
Затем здесь не очень хорошо документированная магия:
public IQueryable<SubItem> GetSubItems([Control("ItemId")] int itemId)
{
return yourDataStore.GetSubItems(itemId);
}
В этом случае valueprovider также может принимать имя свойства, полезное при использовании списков для получения "SelectedValue".
Я нашел ваш вопрос, сделал то же самое, что и вы, тогда я попробовал это решение, которое работает так же хорошо, но намного чище и более в соответствии с идеей концепции. Кажется.
Ответ 3
Взгляните на Упражнение 1: привязка модели в веб-формах ASP.NET → Задача 3 - Поставщики данных в привязке к тексту.
В сигнатуре SelectMethod можно определить какой-либо параметр выбора управления.
Ответ 4
Вы можете использовать Value Providers
Пример:
public IQueryable<Category> GetCategories([Control]int? minProductsCount)
{
}
Этот список ValueProviders: