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