Подтвердить что ты не робот

Можно ли передать значение в 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?

4b9b3361

Ответ 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".

Я нашел ваш вопрос, сделал то же самое, что и вы, тогда я попробовал это решение, которое работает так же хорошо, но намного чище и более в соответствии с идеей концепции. Кажется.

Ответ 4

Вы можете использовать Value Providers

Пример:

public IQueryable<Category> GetCategories([Control]int? minProductsCount)
{
}

Этот список ValueProviders:

  • CompositeValueProvider. Представляет поставщик значений, значения которого исходят от списка поставщиков значений, который реализует интерфейс IEnumerable.

  • QueryStringValueProvider Представляет поставщик значений для строк запроса, которые содержатся в объекте NameValueCollection.

  • RouteDataValueProvider Представляет поставщик значений для данных маршрута, который содержится в объекте, который реализует интерфейс IDictionary(Of TKey, TValue).

  • ControlValueProvider Представляет поставщик значений для значений управления.

  • CookieValueProvider Представляет поставщик значений для значений cookie.

  • FormValueProvider Представляет поставщик значений для значений формы.

  • ProfileValueProvider Представляет поставщик значений для значений профиля.

  • UserProfileValueProvider Представляет поставщик значений для профилей пользователей.

  • ViewStateValueProvider Представляет поставщик значений для значений состояния представления.