Могу ли я нумеровать GroupTemplate или ItemTemplate? - PullRequest
2 голосов
/ 24 марта 2009

Я хотел бы использовать шаблон группы для разделения списка элементов на группы. Однако мне нужно, чтобы каждая группа была пронумерована последовательно, чтобы я мог связываться с ними и реализовывать некоторую подкачку JS. Я привязан к IEnumerable

Вот некоторый псевдокод. Я бы хотел, чтобы результат выглядел так:

<a href="#group1">Go to Group 1<a>
<a href="#group2">Go to Group 2<a>
<a href="#group3">Go to Group 3<a>

<ul id="group1">
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
</ul>
<ul id="group2">
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
</ul>
<ul id="group3">
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
</ul>

Легко ли это сделать в ListView, используя GroupTemplate и ItemTemplate?

<asp:ListView ID="lv" runat="server" GroupPlaceholderID="groupPlaceholder">
    <LayoutTemplate>
        <asp:PlaceHolder ID="groupPlaceholder" runat="server"></asp:PlaceHolder>
    </LayoutTemplate>
    <GroupTemplate>
        <ul id="<!-- group-n goes here -->">
            <asp:PlaceHolder ID="itemPlaceholder" runat="server"></asp:PlaceHolder>
        </ul>
    </GroupTemplate>
    <ItemTemplate>
        <li>Item</li>
    </ItemTemplate>
</asp:ListView>

Я могу получить количество групп для ссылок вверху из источника данных и базовой математики, но как мне получить id = "groupN" число в шаблоне?

Ответы [ 3 ]

4 голосов
/ 24 марта 2009

Я не думаю, что вы можете привязать идентификатор DataBind, так что я бы, вероятно, либо использовал скрытое поле, чтобы JQuery подсчитывал их, либо использовал CssClass. Вы можете использовать Container.DataItemIndex, чтобы получить свой номер.

Edit: просто изменив ul на runat = "server", ASP.NET сгенерирует для вас уникальный идентификатор в своем печально известном формате INamingContainer. Это также будет включать в себя индекс, хотя это будет что-то вроде lv_ctrl0_group, и это деталь реализации.

Вы можете подключить обработчик к событию Init ul и добавить к нему число, сделав его похожим на lv_ctrl0_group1. Я не думаю, что вы можете легко избавиться от предварительно созданного содержимого INamingContainer, и это, вероятно, сломает любые элементы управления IPostDataHandler.

<script runat="server">
    void Group_Init(object sender, EventArgs e) {
       ((Control)sender).ID += groupId++.ToString();
    }
    int groupId = 0;
</script>

<asp:ListView id="lv" runat="server" GroupItemCount="3">
    <LayoutTemplate>
        <asp:PlaceHolder ID="groupPlaceHolder" runat="server" />
    </LayoutTemplate>
    <GroupTemplate>
        <ul id="group" runat="server" oninit="Group_Init">
            <asp:PlaceHolder ID="itemPlaceHolder" runat="server"/>
        </ul>
    </GroupTemplate>
    <ItemTemplate>
        <li>Item</li>
    </ItemTemplate>
</asp:ListView>
1 голос
/ 28 марта 2010

Решение от Keltex выше будет работать с небольшим изменением; используйте <% = </strong> вместо <% # </strong>,

<% # </strong> не будет работать, поскольку GroupTemplate не поддерживает привязку данных

1 голос
/ 24 марта 2009

В вашем файле aspx:

<GroupTemplate>
  <ul id='<%# "group"+GroupNumber %>'>
    <asp:PlaceHolder ID="itemPlaceholder" runat="server"></asp:PlaceHolder>
  </ul>
</GroupTemplate>

В вашем коде (при условии C #):

int _GroupNumber=0;

protected string GroupNumber
{
   get { return (++_GroupNumber).ToString(); }
}
...