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

Связывать словарь с ретранслятором

У меня есть объект-словарь <string, string> и вы хотите привязать его к ретранслятору. Однако я не уверен, что добавить разметку aspx, чтобы фактически отобразить пару ключ-значение. Ошибок не возникает, и я могу заставить его работать с List. Как получить словарь для отображения в ретрансляторе?

4b9b3361

Ответ 1

An IDictionary<TKey,TValue> также является ICollection<KeyValuePair<TKey, TValue>>.

Вам нужно привязать к чему-то вроде (untested):

((KeyValuePair<string,string>)Container.DataItem).Key
((KeyValuePair<string,string>)Container.DataItem).Value

Обратите внимание, что порядок возврата элементов undefined. Они могут быть возвращены в порядке ввода для маленьких словарей, но это не гарантируется. Если вам нужен гарантированный заказ, SortedDictionary<TKey, TValue> сортирует ключ.

Или, если вам нужен другой порядок сортировки (например, по значению), вы можете создать List<KeyValuePair<string,string>> своих пар ключ-значение, затем отсортировать его и привязать к отсортированному списку.

Ответ: Я использовал этот код в разметке, чтобы отображать ключ и значение отдельно:

<%# DataBinder.Eval((System.Collections.Generic.KeyValuePair<string, string>)Container.DataItem,"Key") %>
<%# DataBinder.Eval((System.Collections.Generic.KeyValuePair<string, string>)Container.DataItem,"Value") %>

Ответ 2

<%# Eval("key")%> работал у меня.

Ответ 3

Привязать к набору значений словаря.

myRepeater.DataSource = myDictionary.Values
myRepeater.DataBind()

Ответ 4

Напишите свойство в своем коде для типа записи в вашем словаре. Например, скажем, я привязываю Dictionary<Person, int> к моему ретранслятору. Я бы написал (в С#) свойство, подобное этому в моем коде:

protected KeyValuePair<Person, int> Item
{
    get { return (KeyValuePair<Person, int>)this.GetDataItem(); }
}

Затем, на мой взгляд, я могу использовать сегменты кода следующим образом:

<span><%# this.Item.Key.FirstName %></span>
<span><%# this.Item.Key.LastName %></span>
<span><%# this.Item.Value %></span>

Это значительно упрощает разметку. И хотя я бы предпочел менее общие имена для ссылочных значений, я знаю, что Item.Key является Person и Item.Value является int, и они строго типизированы как таковые.

Вы можете (read: should), конечно, переименовать Item в нечто более символическое из записи в словаре. Это само по себе поможет уменьшить любую двусмысленность в наименовании в моем примере использования.

Нет ничего, что помешало бы вам определить дополнительное свойство, например:

protected Person CurrentPerson
{
    get { return ((KeyValuePair<Person, int>)this.GetDataItem()).Key; }
}

И используя его в вашей разметке:

<span><%# this.CurrentPerson.FirstName %></span>

... ни один из них не позволяет вам получить доступ к соответствующей записи словаря .Value.