【问题标题】:Dynamic menu with ASP.NET repeater带有 ASP.NET 中继器的动态菜单
【发布时间】:2013-11-18 09:40:17
【问题描述】:

目前我正在熟悉 ASP.NET,但我遇到了“Repeater”的“ItemTemplate”中动态内容的问题。这是我的代码:

<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 和该项目的文本。 问题是,我需要每个链接的“Onclick”asp.net 处理程序(这是“主”用户控件的菜单,每次单击时,我将根据主控中的选定项目更改子用户控件的内容)。

有什么建议吗?

编辑:我已经尝试过像这样使用 LinkBut​​ton:

<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:我目前拥有的完整列表(仅&lt;li&gt;&lt;/li&gt; 呈现为实际 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>

另外我忘了说,这实际上是一个用于 Umbraco 项目的 .Net 用户控件。 在protected void Page_Load(object sender, EventArgs e) 方法中为转发器附加数据源。

【问题讨论】:

  • 你为什么不改用LinkButton
  • 我试过这样做,但我不知道如何正确插入我列出的代码的 ID 和名称。当我通过 DataBinder.Eval 插入 LinkBut​​ton 的这个“a”标签时,它只是没有呈现。
  • 您不需要将所有信息放入您的LinkButton,您只需要知道单击了哪个项目,其余的可以从可能隐藏的其他控件中获取(例如@ 987654329@ 你可以使用HiddenField)。您可以通过FindControlLinkButtonNamimgContainer 上的Click 事件中获得其他控件。
  • 如何根据中继器中的当前项目为其设置文本?
  • 您通过DataBinder.Eval(如上)或通过代码隐藏(ItemDataBound 事件)设置文本。

标签: asp.net umbraco webusercontrol


【解决方案1】:

请这样尝试

<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>

这将保留 CommandArgument 中的“Id”字段和 Text 属性中的“Name”字段

在 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 ...
}

【讨论】:

  • 由于某种原因仍然无法正常工作。代码与您提供的代码相同。但仅渲染此 LinkBut​​ton 的
  • 包装器,并且仅用于转发器中的第一个元素。
  • 奇怪,它对我来说很好用。你能告诉我你最近的代码吗?
  • 你在 MasterPage 后面的代码中有 linkMenu_Click 事件处理程序(代码和我一样)?
  • 是的,完全一样
  • 座右铭,谢谢,但我已经解决了这个问题。看来,这个“LinkBut​​ton”以及“Button”需要带有 runat=server 作为包装器的“form”标签才能正常工作。
  • 【解决方案2】:

    通过在我的&lt;nav&gt; 标签周围添加&lt;form runat="server"&gt; 解决了问题。 似乎每个&lt;asp:button\linkbutton&gt; 都需要这样才能正常工作。

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签