C# HTML递归绑定

C# HTML递归绑定,c#,asp.net,html,C#,Asp.net,Html,我有一个数据包,如下所示: id menuname url parentid 1 Home ~/Home.aspx NULL 2 Product ~/products.aspx NULL 3 Services ~/services.aspx NULL 4 ERP ~/erp.aspx 2 5

我有一个数据包,如下所示:

id      menuname    url                  parentid
1       Home        ~/Home.aspx          NULL   
2       Product     ~/products.aspx      NULL 
3       Services    ~/services.aspx      NULL   
4       ERP     ~/erp.aspx           2
5       HRM         ~/hrm.aspx           4
7       Payroll     ~/payroll.aspx       4
8       Programming ~/programming.aspx   3
9       Advertising ~/advert.aspx        3
10      Television Advert ~/tvadvert.aspx 9
11      Radio Advert ~/radioadvert.aspx  9
........
........
因此,我想根据上面的datatable将菜单项生成一个无序列表,这样parentid为null的项应该是第一级菜单 其他子菜单将基于其parentid,如下所示:

<ul class="menu">
    <li><a href="home.aspx">Home</a></li>
    <li><a href="produc.aspx">Product</a>
            <ul>
                <li>
                <a href="erp.aspx">ERP</a>  
                    <ul>
                        <li><a href="hrm.aspx">HRM</a></li>
                        <li><a href="payroll.aspx">Payroll</a></li>
                    </ul>
                </li>
            </ul>
    </li>
    <li><a href="services.aspx">Services</a>
            <ul>
                <li><a href="programming.aspx">Advertising</a></li>
                <li><a href="advert.aspx">Programming</a></li>
            </ul>
    </li>

    .....etc
</ul>
下面是我似乎不完整的代码:

public static String AddToList() 
    {


        DataTable table = new DataTable();
        table = GetMenus();

        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        foreach (DataRow row in table.Rows())
        {
            string parentId = row["parentmenuId"].ToString();
            //string url = Server.MapPath(m.Url);
            if (string.IsNullOrEmpty(parentId))
            {
                sb.Append(String.Format("<ul class=\"menu\"><li><a href=\"{0}\">{1}</a></li></ul>", row["Url"].ToString(), row["Description"].ToString()));
            }

        }

        return sb.ToString();

    }




This gets all top menu but all other effort to get submenu doesnt work. Pls help me out.

Thanks in advance
public静态字符串AddToList()
{
DataTable=新的DataTable();
table=GetMenus();
System.Text.StringBuilder sb=新的System.Text.StringBuilder();
foreach(表.Rows()中的DataRow行)
{
字符串parentId=行[“parentmenuId”]。ToString();
//字符串url=Server.MapPath(m.url);
if(string.IsNullOrEmpty(parentId))
{
sb.Append(String.Format(“
    • ”,第[“Url”].ToString()行,第[“Description”].ToString()行); } } 使某人返回字符串(); } 这将获得所有顶部菜单,但所有其他获取子菜单的努力都不起作用。请帮帮我。 提前谢谢
出于纯粹的厌倦,我们使用asp.net控件的组合(每个控件都有一个控件属性),它已经是一个树,并以树的形式呈现(这意味着我不需要真正的递归),以及一个索引数组,以便通过id轻松访问创建的控件

  public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Form.Controls.Add(AddToList()); 
    }

   public static HtmlGenericControl AddToList()      
   {
       HtmlGenericControl menu = new HtmlGenericControl("ul");
       DataTable table = GetMenus();
       //NOTE  i initialized this to 7, because this is the max rows id, and
       // im basing my builder on indexes to work. This can be easily replaced to
       // a dictionary<int,HtmlGenericControl> or any othre suitable collection
       HtmlGenericControl[] arrayOfLists = new HtmlGenericControl[7];
       foreach (DataRow row in table.Rows)
       {
          //assume control has no children, unless proved otherwise
           HtmlGenericControl temp  = new HtmlGenericControl("li");
           //add the control to its indexes place in the array and init it
           arrayOfLists[(int)row["id"] - 1] = temp;
           HtmlAnchor link = new HtmlAnchor();
           link.HRef = row["url"].ToString();
           link.InnerText = row["menuname"].ToString();
           temp.Controls.Add(link);
           int? parentId = string.IsNullOrEmpty(row["parentmenuId"].ToString()) ? null : (int?)int.Parse(row["parentmenuId"].ToString());
           if (parentId.HasValue)
           {
               // if a control has a parent - make its parent a ul insead of li
              // and add it to the parents collection
               arrayOfLists[parentId.Value - 1].TagName = "ul";
               arrayOfLists[parentId.Value - 1].Controls.Add(arrayOfLists[(int)row["id"] - 1]);
           }
           else
           {
                // no parent = add to the first created ul menu
               menu.Controls.Add(temp);
           }

       }

       return menu;     
   }

   public static DataTable GetMenus()
   {
       DataTable dt = new DataTable ();
       dt.Columns.Add("id", typeof(int));
       dt.Columns.Add("menuname", typeof(string));
       dt.Columns.Add("url", typeof(string));
       dt.Columns.Add("parentmenuId", typeof(string));
       dt.Rows.Add(1,"Home","~/Home.aspx",        null  );
       dt.Rows.Add( 2,"Product","~/products.aspx",    null);
       dt.Rows.Add(3,"services", "~/services.aspx",null);
       dt.Rows.Add(4, "ERP",  "~/erp.aspx",           "2" );
       dt.Rows.Add( 5  ,"HRM" ,"~/hrm.aspx",           "4" );
       dt.Rows.Add(7, " Payroll", "~/payroll.aspx", "4");
       return dt;

   }
public分部类\u默认值:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
Add(AddToList());
}
公共静态HtmlGenericControl AddToList()
{
HtmlGenericControl菜单=新的HtmlGenericControl(“ul”);
DataTable=GetMenus();
//注意,我将其初始化为7,因为这是最大行id,并且
//我把我的构建器建立在索引的基础上工作。这可以很容易地替换为
//字典或其他合适的收藏
HtmlGenericControl[]arrayOfLists=新的HtmlGenericControl[7];
foreach(table.Rows中的DataRow行)
{
//假设控件没有子对象,除非另有证明
HtmlGenericControl temp=新的HtmlGenericControl(“li”);
//将控件添加到它在数组中的索引位置并初始化它
arrayOfLists[(int)行[“id”]-1]=临时;
HtmlAnchor link=新HtmlAnchor();
link.HRef=row[“url”].ToString();
link.InnerText=行[“menuname”].ToString();
温度控制添加(链接);
int?parentId=string.IsNullOrEmpty(第[“parentmenuId”].ToString())行?null:(int?)int.Parse(第[“parentmenuId”].ToString()行);
if(parentId.HasValue)
{
//如果控件有父控件-将其父控件设为ul insead li
//并将其添加到父集合中
arrayOfLists[parentId.Value-1]。标记名=“ul”;
arrayOfLists[parentId.Value-1].Controls.Add(arrayOfLists[(int)行[“id”]-1]);
}
其他的
{
//无父项=添加到第一个创建的ul菜单
菜单.控件.添加(临时);
}
}
返回菜单;
}
公共静态数据表GetMenus()
{
DataTable dt=新的DataTable();
添加(“id”,typeof(int));
添加(“menuname”,typeof(string));
添加(“url”,typeof(string));
Add(“parentmenuId”,typeof(string));
添加(1,“Home”,“~/Home.aspx”,null);
添加(2,“Product”,“~/products.aspx”,空);
Add(3,“services”,“~/services.aspx”,null);
添加(4,“ERP”、“~/ERP.aspx”、“2”);
添加(5,“HRM”、“~/HRM.aspx”、“4”);
添加(7,“Payroll”、“~/Payroll.aspx”、“4”);
返回dt;
}

首先,您的代码中没有递归。我假设菜单的树状结构意味着呈现它的代码中存在递归。感谢您不让我知道这是否有用。评论/接受/拒绝答案真的有那么难吗?