Повторитель в привязке данных повторителя (без обратной передачи)
Для решения я не могу использовать любые методы обратной передачи, потому что все это работает через ajax. Решение должно быть реализовано в коде asp.net.
у меня есть List<WebPage>
который содержит список ссылок (List<Link>)
и мне нужно, чтобы все ссылки связывали повторяющуюся информацию, такую как заголовок страницы, идентификатор, URL. Вот мой текущий репитер.
<div id="result">
<asp:Repeater runat="server" id="results">
<Itemtemplate>
<asp:Repeater runat="server" datasource='<%# Eval("Links") %>'>
<Itemtemplate>
<tr class="gradeX odd">
<td><%# Eval("Id") %></td> //property of WebPage (part of results repeater)
<td><%# Eval("Title") %></td> //property of WebPage (part of results repeater)
<td><%# Eval("Url") %></td> //property of WebPage (part of results repeater)
<td><%# Eval("URL") %></td>//Property of Link
<td><%# Eval("URLType") %></td> //Property of Link
<td><%# Eval("URLState") %></td> //Property of Link
</tr>
</Itemtemplate>
</asp:Repeater>
</Itemtemplate>
</asp:Repeater>
</div>
конечно, это не работает, как я могу это сделать?
Спасибо за вашу помощь!
1 ответ
Я предполагаю, что проблема, которую вы пытаетесь решить, состоит в том, как включить свойства нескольких уровней во вложенный объект - некоторые свойства верхнего уровня, но другие свойства нижнего уровня. Один из простых способов сделать это - преобразовать внутреннюю коллекцию в новый тип, содержащий все необходимые свойства.
Вот пример кода, иллюстрирующий эту технику, используя IEnumerable.Select
и C# анонимные классы для создания нового класса:
<%@ Page Title="Home Page" Language="C#" %>
<div id="result">
<asp:Repeater runat="server" id="results">
<ItemTemplate>
<asp:Repeater runat="server" datasource='<%# ((WebPage)Container.DataItem).Links.Select ( link => new {
Id = ((WebPage)Container.DataItem).Id,
Title = ((WebPage)Container.DataItem).Title,
Url = ((WebPage)Container.DataItem).Url,
URL = link.URL,
URLType = link.URLType,
URLState = link.URLState
}) %>'>
<ItemTemplate>
<tr class="gradeX odd">
<td><%# Eval("Id") %></td> <!--property of WebPage (part of results repeater) -->
<td><%# Eval("Title") %></td> <!--property of WebPage (part of results repeater) -->
<td><%# Eval("Url") %></td> <!--property of WebPage (part of results repeater) -->
<td><%# Eval("URL") %></td><!--Property of Link -->
<td><%# Eval("URLType") %></td> <!--Property of Link-->
<td><%# Eval("URLState") %></td> <!--Property of Link -->
</tr>
</ItemTemplate>
</asp:Repeater>
</Itemtemplate>
</asp:Repeater>
</div>
<script runat="server">
public class Link
{
public string URL { get; set; }
public int URLType { get; set; }
public int URLState { get; set; }
}
public class WebPage
{
public string Id { get; set; }
public string Title { get; set; }
public string Url { get; set; }
public List<Link> Links { get; set; }
}
protected void Page_Load(object sender, EventArgs e)
{
WebPage[] pages = new WebPage[]
{
new WebPage { Id = "foo",
Title = "foobar",
Url = "http://foo.bar",
Links = new List<Link> ( new Link[] {
new Link {URL = "http://something", URLType = 1, URLState = 2},
new Link {URL = "http://someotherthing", URLType = 3, URLState = 4}
})
},
new WebPage { Id = "excellent",
Title = "excellent Title",
Url = "http://excellent.com",
Links = new List<Link> ( new Link[] {
new Link {URL = "http://excellent", URLType = 5, URLState = 6},
new Link {URL = "http://totallyexcellent", URLType = 7, URLState = 8}
})
}
};
results.DataSource = pages;
results.DataBind();
}
</script>