2

現在、次のような動的メニューがあります。

<asp:Repeater runat="server" id="MenuRepeater">
  <headertemplate>
       <div class="navbar navbar-inverse navbar-fixed-top">
      <div class="navbar-inner">
        <div class="container">
          <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </a>
          <a class="brand" href="#">KezBlu</a>
          <div class="nav-collapse collapse">
            <ul class="nav">
  </headertemplate>
  <itemtemplate>
     <li><a href='<%# Eval("PageFile") %>'><%# Eval("DisplayName") %></a></li>
  </itemtemplate>
  <footertemplate>
             </ul>
          </div><!--/.nav-collapse -->
        </div>
      </div>
    </div>
  </footertemplate>
 </asp:Repeater>

データソースは次のとおりです。

 public partial class KezberProjectManager : System.Web.UI.MasterPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            MenuRepeater.DataSource = GetMenu();
            MenuRepeater.DataBind();
        }

        protected DataTable GetMenu() 
        {
          // you would normally pull this from a database, this is here
          // only to show the idea.
          DataTable menu = new DataTable();
          menu.Columns.Add("PageFile", typeof(String));
          menu.Columns.Add("DisplayName", typeof(String));

          DataRow row = menu.NewRow();
          row["PageFile"] = "home.aspx";
          row["DisplayName"] = "Home";
          menu.Rows.Add(row);

          row = menu.NewRow();
          row["PageFile"] = "Accounts.aspx";
          row["DisplayName"] = "Accounts";
          menu.Rows.Add(row);

          row = menu.NewRow();
          row["PageFile"] = "Logout.aspx";
          row["DisplayName"] = "Logout";
          menu.Rows.Add(row);

          return menu;
        }
    }

これはうまく機能しますが、サブメニューも必要です。

何らかの方法で各アイテムにリピーターを持たせる方法、またはより良い方法はありますか?

ありがとう

4

1 に答える 1

1

ネストされたリピーターを使用できます。

<asp:Repeater ID="rptFirstLevel" runat="server">
    <ItemTemplate>
        <!-- first level html --> 
        <asp:Repeater ID="rptSecondLevel" DataSource='<%# DataBinder.Eval(Container.DataItem, "Children") %>' runat="server">
            <ItemTemplate>
                <!-- second level html -->
            </ItemTemplate>
        </asp:Repeater>
     </ItemTemplate>
</asp:Repeater>

コードでは、最初のリピーターを適切にデータバインドしていることを確認してください。

rptFirstLevel.DataSource = menu;
rptFirstLevel.DataBind();

そして、menuオブジェクトにChildrenコレクションが含まれていること。これは、考えられる多くの解決策の1つにすぎません。それが役に立てば幸い。

于 2013-01-30T22:13:09.293 に答える