Динамическое меню с ретранслятором ASP.NET

В настоящее время я знакомлюсь с ASP.NET, и у меня возникла проблема с динамическим содержимым внутри «ItemTemplate» в «Repeater». Вот мой код:

<asp:Repeater ID="sidebarRepeater" runat="server">
     <ItemTemplate>
           <li>
               <a href="#<%# DataBinder.Eval(Container.DataItem, "Id") %>"><%# DataBinder.Eval(Container.DataItem, "Name") %></a>
           </li>
      </ItemTemplate>
</asp:Repeater>

Я получаю список ссылок с href == Id текущего элемента и текстом этого элемента. Проблема в том, что мне нужен обработчик asp.net «Onclick» для каждой из этих ссылок (это меню пользовательского элемента управления «Мастер», и при каждом щелчке я должен изменять содержимое дочернего пользовательского элемента управления в соответствии с выбранным элементом в главном элементе. ).

Какие-нибудь советы?

Изменить: я уже пробовал использовать LinkButton, например:

<li>
    <asp:LinkButton ID='<%# DataBinder.Eval(Container.DataItem, "Id") %>' runat="server" OnClick="ChangeSomething">
        <%# DataBinder.Eval(Container.DataItem, "Name") %>
    </asp:LinkButton>
</li>

Edit2: В настоящее время моя разметка выглядит так:

<li>
    <input type="hidden" value="<%# DataBinder.Eval(Container.DataItem, "Id") %>"
    <asp:LinkButton runat="server" ID="LinkButton_Office" Text='<%# DataBinder.Eval(Container.DataItem, "Name") %>'/>
</li>

В этом случае он рисует только элемент «скрытый ввод» только для первого элемента в репитере.

Edit3: полный список того, что у меня есть в настоящее время (только <li></li> преобразовано в фактический HTML):

<div class="row">
    <div class="twelve column">
        <div class="row">
            <div class="side-bar">
                <nav>
                    <ul>
                <asp:Repeater ID="sidebarRepeater" runat="server">
                    <ItemTemplate>
                        <li>
                            <asp:LinkButton ID="linkSidebar" runat="server" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "Id") %>' Text='<%# DataBinder.Eval(Container.DataItem, "Name") %>' OnClick="linkMenu_Click"></asp:LinkButton>
                        </li>
                    </ItemTemplate>
                </asp:Repeater>
                    </ul>
                </nav>
            </div>
            <div class="page">
                <asp:PlaceHolder runat="server" ID="contentPlaceholder" />
            </div>
        </div>
    </div>
</div>

Также я забыл сказать, что на самом деле это пользовательский элемент управления .Net для проекта Umbraco. Источник данных прикреплен к ретранслятору методом protected void Page_Load(object sender, EventArgs e).


person Kamilius    schedule 18.11.2013    source источник
comment
Почему бы вам не использовать вместо этого LinkButton?   -  person Tim Schmelter    schedule 18.11.2013
comment
Я пытался это сделать, но не знаю, как правильно вставить в него идентификатор и имя моего перечисленного кода. Когда я вставлял через DataBinder.Eval, как для этого тега «a» для LinkButton, он просто не отображался.   -  person Kamilius    schedule 18.11.2013
comment
Вам не нужно помещать всю информацию в свой LinkButton, вам просто нужно знать, какой элемент был нажат, остальное можно получить из других элементов управления, которые могут быть скрыты (например, для ID вы можете использовать HiddenField). Вы получаете другие элементы управления через FindControl на NamimgContainer LinkButton в Click событии.   -  person Tim Schmelter    schedule 18.11.2013
comment
Как установить для него текст в соответствии с текущим элементом репитера?   -  person Kamilius    schedule 18.11.2013
comment
Вы устанавливаете текст через DataBinder.Eval (как указано выше) или через программный код (событие ItemDataBound).   -  person Tim Schmelter    schedule 18.11.2013
comment
Просто попытался сделать, как предложил Motomoto Pink, но элемент все еще не отображается.   -  person Kamilius    schedule 18.11.2013


Ответы (2)


Пожалуйста, попробуйте вот так

<asp:Repeater ID="sidebarRepeater" runat="server">
    <ItemTemplate>
        <asp:LinkButton ID="linkMenu" runat="server" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "Id") %>' Text='<%# DataBinder.Eval(Container.DataItem, "Name") %>' OnClick="linkMenu_Click"></asp:LinkButton>
    </ItemTemplate>
</asp:Repeater>

Это сохранит поле "Id" в CommandArgument и поле "Name" в свойствах Text.

В обработчике событий linkMenu_Click вы получите значения Id и Name в качестве образца кода.

protected void linkMenu_Click(object sender, EventArgs e)
{
    LinkButton link = (LinkButton)sender;
    string id = link.CommandArgument;
    string name = link.Text;

    //Implement the different display of each menu here ...
}
person Alice    schedule 18.11.2013
comment
По-прежнему не работает по какой-то причине. Код идентичен предоставленному вами. Но визуализируется только оболочка ‹li› для этого LinkButton, и только для первого элемента в репитере. - person Kamilius; 18.11.2013
comment
Странно, у меня работает нормально. Не могли бы вы показать мне ваш последний код? - person Alice; 18.11.2013
comment
И у вас есть обработчик событий linkMenu_Click (с таким же кодом, как у меня) в коде за MasterPage? - person Alice; 18.11.2013
comment
Да совершенно то же самое - person Kamilius; 18.11.2013
comment
Девиз, спасибо, но я уже решил это. Кажется, что этот LinkButton, а также Button нуждаются в теге формы с runat = server в качестве оболочки для правильной работы. - person Kamilius; 18.11.2013
comment
Итак, вы никогда не переносите весь код тегом '‹form runat = server›' с момента запуска. Здорово, что вы смогли это решить :) - person Alice; 18.11.2013
comment
Я на 100% новичок в классическом ASP.NET, и в настоящее время у меня нет нормальной литературы, чтобы заполнить основы. Так что да, я не знал об этом :) И спасибо за помощь - person Kamilius; 18.11.2013

Проблема решена путем добавления <form runat="server"> вокруг моего тега <nav>. Похоже, что каждому из <asp:button\linkbutton> это необходимо для правильной работы.

person Kamilius    schedule 18.11.2013