0

我正在开发一个 C# webforms 应用程序,并且有一个数据层,它根据客户编号和订单类型收集有关客户可以看到的菜单的信息。

我一直在使用 ASP.NET 菜单控件,直到 qa 部门要求更改菜单以在单击时展开而不是悬停。那时,我决定尝试使用更简单的 css/html/jquery 方法来制作菜单,但我遇到了麻烦。

我的数据层中有以下方法,它获取菜单信息并将其作为 XML 返回。我坚持的是如何获取正在收集的 XML,当我使用菜单控件并希望将其重新格式化为 UL 以便在我想做的 html/css 方法中使用时。

public static string BuildMenu(string cprcstnm, string docType)
    {
        DataSet ds = new DataSet();
        string connStr = ConfigurationManager.ConnectionStrings["DynamicsConnectionString"].ConnectionString;
        using (SqlConnection conn = new SqlConnection(connStr))
        {
            string sql = "usp_SelectItemMenuByCustomer";
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
            da.SelectCommand.Parameters.Add("@CPRCSTNM", SqlDbType.VarChar).Value = cprcstnm;
            da.SelectCommand.Parameters.Add("@DOCID", SqlDbType.VarChar).Value = docType;
            da.Fill(ds);
            da.Dispose();
        }
        ds.DataSetName = "Menus";
        ds.Tables[0].TableName = "Menu";
        DataRelation relation = new DataRelation("ParentChild",
                                                 ds.Tables["Menu"].Columns["MenuID"],
                                                 ds.Tables["Menu"].Columns["ParentID"],
                                                 false);

        relation.Nested = true;
        ds.Relations.Add(relation);

        return ds.GetXml();
    }

输出的 XMl 样本如下:

<Menus>
- <Menu>
  <MenuID>23</MenuID> 
  <ITEMNMBR>0</ITEMNMBR> 
  <Text>ACC</Text> 
  <Description>ACC</Description> 
  <ParentID>0</ParentID> 
- <Menu>
  <MenuID>34</MenuID> 
  <ITEMNMBR>1</ITEMNMBR> 
  <Text>BASE</Text> 
  <Description>BASE</Description> 
  <ParentID>23</ParentID> 
- <Menu>
  <MenuID>516</MenuID> 
  <ITEMNMBR>2</ITEMNMBR> 
  <Text>HYP</Text> 
  <Description>HYP</Description> 
  <ParentID>34</ParentID> 

我需要将其转换为以下内容:

<ul class="dropdown">
    <li><a href="#">ACC</a>
        <ul class="sub_menu">
           <li>
          <a href="#">BASE</a>
              <ul>
            <li>
              <a href="#">HYP</a>
              <ul>
            <li><a href="#">Terminal 1</a></li>
            <li><a href="#">Terminal 1</a></li>
               </ul>    
        </li>
    </ul>
</li>
4

2 回答 2

1

您将从以下 MSDN 链接中获得一些想法,该链接说明了使用 xslt 从数据集中编写 html

http://msdn.microsoft.com/en-us/library/8fd7xytc(v=vs.80).aspx

于 2013-03-25T19:31:12.160 回答
0

没有通用的方法可以做到这一点。或者某种 GUI 工具可以为您制作。

您将不得不操作您的 XML 并将其转换为等效的(根据您的需要)html。

  • 首先我建议您,如果您只想处理点击效果MenuItems和 CSS 相关问题,请不要更改它。您可以非常轻松地将 jQuery 函数绑定到您的ASP Menu项目。你可以很容易地做到这一点。只需添加一个css classasp:menuItem使用 jQuery 抓取它,如下所示:

    <asp:Menu ID="myMenu" runat="server">
    ..
    <asp:MenuItem NavigateUrl="" CssClass="menuItem" Text="Menu1" Value="Menu1"/>
    

    并抓住它

      $('.menuItem').click(function(){
             $(this).css({'width':'100px'});
      });
    
  • 如果您真的要丢弃 ASP 菜单控件,而不是 XML 数据源menus,那么请准备好进行一些严重的字符串操作。像这样做。

    XmlDocument doc = new XmlDocument(xml);
    XmlNodeList menus = doc.SelectNodes("//Menus/Menu");
    
    string html ="<ul>";
    foreach(XmlNode menu in menus)
    {
       html += "<li><a href='#' >";
       html += menu.SelectSingleNode("Text").InnerText + "</a></li>";
    }
    html +="</ul>";
    
于 2013-03-25T19:33:49.897 回答