2010-06-22 4 views
1

Для решения я не могу использовать методы обратной передачи, потому что это все работает через ajax. Решение должно быть реализовано в коде asp.net.Repeater in Repeater Databinding (no postback)

У меня есть List<WebPage>, который содержит список ссылок (List<Link>), и мне нужно, чтобы все ссылки связывали повторяющиеся данные, такие как название страницы, id, 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> 

Конечно, это не работает, как я могу это сделать?

Благодарим за помощь!

+0

я уверен, что вы найдете полезный пример здесь http://stackoverflow.com/questions/2923137/повторитель-в-повторителе – marapet

+0

Не совсем, я посмотрел на него уже. Мне действительно нужно решение asp.net. Я не могу делать такие вещи на веб-сайте, основанном на ajax. – Pierluc

+0

страница вызывается через ajax и возвращающий html-код, фактическая страница, содержащая ретранслятор, никогда не отображается пользователю. После того, как метод загрузки страницы завершен, код html страницы возвращается и «привязан» с помощью вложений jQuery. – Pierluc

ответ

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>