C# 使用缩进显示父/子名称

C# 使用缩进显示父/子名称,c#,asp.net,C#,Asp.net,我有一个具有父/子关系的对象 下面是我的简短版本,但下面是核心道具 public class Company { Name {get;set;} List<Company> ChildCompany {get;set;} } 我的代码: Company company = new Company(); company = GetDataForCompany(); //DAL if(!string.IsNullEmpty(company.Name)) { //

我有一个具有父/子关系的对象

下面是我的简短版本,但下面是核心道具

public class Company
{
  Name {get;set;}
  List<Company> ChildCompany {get;set;} 
}
我的代码:

Company company = new Company();
company = GetDataForCompany(); //DAL

if(!string.IsNullEmpty(company.Name))
{

     //dispaly Name
     PlaceHolder ph;
     l = new Literal();
     l.Text = "<ul>" + Environment.NewLine;
     ph.Controls.Add(l);
     l = new Literal();
     l.Text = "<li">";
     ph.Controls.Add(l);
     hl = new HyperLink();
     hl.Text = company.Name;
     ph.Controls.Add(hl);


    foreach (Company item in company)
    {
          l = new Literal();
          l.Text = "<li">";
          ph.Controls.Add(l);
          hl = new HyperLink();
          hl.Text = item.Name;
          ph.Controls.Add(hl);
    }

}

上面的代码似乎并没有像上面所示完全呈现我想要的内容。

您没有将子公司嵌套在另一个无序列表中。您需要检查子公司并将这些列表项嵌套在另一个列表中,以使HTML看起来像您需要的那样

// Code to display name here....
if (company.ChildCompany != null && company.ChildCompany.Count > 0)
{
    l = new Literal();
    l.Text = "<ul>";
    ph.Controls.Add(l);


    foreach (Company item in company.ChildCompany)
    {
        // Code for children.
    }

    l = new Literal();
    l.Text = "</ul>";
    ph.Controls.Add(l);
}
输出结果应类似于:

<ul>
     <li>Company
         <ul>
             <li>Child Company #1</li>
             <li>Child Company #2</li>
         </ul>
     </li>
 </ul>

您没有将子公司嵌套在另一个无序列表中。您需要检查子公司并将这些列表项嵌套在另一个列表中,以使HTML看起来像您需要的那样

// Code to display name here....
if (company.ChildCompany != null && company.ChildCompany.Count > 0)
{
    l = new Literal();
    l.Text = "<ul>";
    ph.Controls.Add(l);


    foreach (Company item in company.ChildCompany)
    {
        // Code for children.
    }

    l = new Literal();
    l.Text = "</ul>";
    ph.Controls.Add(l);
}
输出结果应类似于:

<ul>
     <li>Company
         <ul>
             <li>Child Company #1</li>
             <li>Child Company #2</li>
         </ul>
     </li>
 </ul>

首先,文本并不适合这样的任务,但您有一个更适合您的目标的示例HtmlGenericControl。对于占位符也是一样-这些是模板-

HtmlGenericControl unorderedList = new HtmlGenericControl("ul");

HtmlGenericControl tempItem = null;
HtmlGenericControl tempAnchor = null;

foreach (Company item in company)
{
     tempItem = new HtmlGenericControl("li");
     unorderedList.Controls.Add(tempItem);

     tempAnchor = new HtmlGenericControl("a");
     tempAnchor.Controls.Add(new Literal { Text = item.Name });
     tempItem.Controls.Add(tempAnchor);
}
如果您需要更多功能,可以使用System.Web.HtmlControls命名空间,该命名空间具有用于任何常见XHTML表单元素的Web控件,以及更多:

关于文字,这些用于本地化,或者是在服务器控件中表示文字的好方法,因为文字与任何其他控件一样具有标识符,从而简化了文本替换和其他任务


另一个重要点是,缩进将通过覆盖服务器控件的方法(如Render、RenderChildren等)来实现,该方法提供对HtmlTextWriter的访问,文本流编写器稍后将其输出放入HTTP响应流。

首先,文本不适用于此类任务,但是你有一个更适合你目标的HtmlGenericControl。对于占位符也是一样-这些是模板-

HtmlGenericControl unorderedList = new HtmlGenericControl("ul");

HtmlGenericControl tempItem = null;
HtmlGenericControl tempAnchor = null;

foreach (Company item in company)
{
     tempItem = new HtmlGenericControl("li");
     unorderedList.Controls.Add(tempItem);

     tempAnchor = new HtmlGenericControl("a");
     tempAnchor.Controls.Add(new Literal { Text = item.Name });
     tempItem.Controls.Add(tempAnchor);
}
如果您需要更多功能,可以使用System.Web.HtmlControls命名空间,该命名空间具有用于任何常见XHTML表单元素的Web控件,以及更多:

关于文字,这些用于本地化,或者是在服务器控件中表示文字的好方法,因为文字与任何其他控件一样具有标识符,从而简化了文本替换和其他任务


另一个重要的一点是,缩进将通过覆盖服务器控件的方法(如Render、RenderChildren等)来实现,该方法提供对HtmlTextWriter的访问,文本流编写器稍后将其输出放入HTTP响应流。

@AbuHamazah它呈现了什么?您可以编辑您的问题以包含预期的标记与实际标记吗?我清理并运行了您的代码,并基于这样一个假设,即您得到的错误输出是因为它没有嵌套列表项。它将所有内容都放在一个无序的列表中,而不是像你声称的那样嵌套。@AbuHamazah它呈现了什么?你能编辑你的问题以包含预期的标记和实际的标记吗?我清理并运行了你的代码,基于这样一个假设,您得到的糟糕输出是因为它没有嵌套列表项。它把所有东西都放在一个无序的列表中,而不是像你声称的那样嵌套。比我的答案更好,包括提到使用HTMLGenericControl@Abu需要确保他也将子公司放入他们自己的无序列表中,以获得他想要的缩进。@Blake是的,当然,但是,我在回答中没有提到这一点,因为我相信OP需要更多地与ASP.NET联系:比我的答案更好,包括提到使用HTMLGenericControl@Abu需要确保他也将子公司放入他们自己的无序列表中,以获得他想要的缩进。@Blake是的,当然,但是,我在回答中没有提到这一点,因为我认为OP需要更多地与ASP.NET联系: