Controls.Add 从列表中删除以前的项目
Controls.Add removing previous items from list
我正在尝试在我的控制器中创建一个动态菜单,然后将其渲染到我的视图中。我发现 Controls.Add 正在从我的列表中删除项目,我最终只显示最后一项。我如何确保它显示我列表中的所有项目以及如何在创建动态菜单后完成子元素的显示?
public string CreateDynamicMenu()
{
HtmlGenericControl navbar = new HtmlGenericControl("nav");
navbar.Attributes.Add("class", "navbar navbar-default");
HtmlGenericControl containerDiv = new HtmlGenericControl("div");
containerDiv.Attributes.Add("class", "container-fluid");
HtmlGenericControl collapseDiv = new HtmlGenericControl("div");
collapseDiv.Attributes.Add("class", "collapse navbar-collapse");
HtmlGenericControl navUl = new HtmlGenericControl("ul");
navUl.Attributes.Add("class", "nav navbar-nav");
HtmlGenericControl dropdownLi = new HtmlGenericControl("li");
dropdownLi.Attributes.Add("class", "dropdown");
HtmlGenericControl mainMenuA = new HtmlGenericControl("a");
var myMenu = menuListForUserG.GetMenus(Global.CurrentProfile.UserID).OrderBy(x => x.MenuOrder).ThenBy(y => y.MenuName);
var navbarmenu = myMenu.Where(x => x.ParentID == null);
foreach (var item in navbarmenu)
{
mainMenuA.InnerText = item.MenuName;
dropdownLi.Controls.Add(mainMenuA);
navUl.Controls.Add(dropdownLi);
}
collapseDiv.Controls.Add(navUl);
containerDiv.Controls.Add(collapseDiv);
navbar.Controls.Add(containerDiv);
StringBuilder htmlStringBuilder = new StringBuilder();
HtmlTextWriter htmlStringWriter = new HtmlTextWriter(new StringWriter(htmlStringBuilder));
navbar.RenderControl(htmlStringWriter);
String output = htmlStringBuilder.ToString();
return output; }
问题是您在循环中一遍又一遍地添加 dropdownLi
和 mainMenuA
的相同实例。我想 Control.Add 不会将重复项添加到列表中,因此控件实际上只添加了一次。在循环的最后 运行 中,将文本更改为最后一项的文本。
为了解决这个问题,您需要按如下方式创建新实例:
foreach (var item in navbarmenu)
{
// Move the following lines from outside the loop inside
HtmlGenericControl dropdownLi = new HtmlGenericControl("li");
dropdownLi.Attributes.Add("class", "dropdown");
HtmlGenericControl mainMenuA = new HtmlGenericControl("a");
mainMenuA.InnerText = item.MenuName;
dropdownLi.Controls.Add(mainMenuA);
navUl.Controls.Add(dropdownLi);
}
我正在尝试在我的控制器中创建一个动态菜单,然后将其渲染到我的视图中。我发现 Controls.Add 正在从我的列表中删除项目,我最终只显示最后一项。我如何确保它显示我列表中的所有项目以及如何在创建动态菜单后完成子元素的显示?
public string CreateDynamicMenu()
{
HtmlGenericControl navbar = new HtmlGenericControl("nav");
navbar.Attributes.Add("class", "navbar navbar-default");
HtmlGenericControl containerDiv = new HtmlGenericControl("div");
containerDiv.Attributes.Add("class", "container-fluid");
HtmlGenericControl collapseDiv = new HtmlGenericControl("div");
collapseDiv.Attributes.Add("class", "collapse navbar-collapse");
HtmlGenericControl navUl = new HtmlGenericControl("ul");
navUl.Attributes.Add("class", "nav navbar-nav");
HtmlGenericControl dropdownLi = new HtmlGenericControl("li");
dropdownLi.Attributes.Add("class", "dropdown");
HtmlGenericControl mainMenuA = new HtmlGenericControl("a");
var myMenu = menuListForUserG.GetMenus(Global.CurrentProfile.UserID).OrderBy(x => x.MenuOrder).ThenBy(y => y.MenuName);
var navbarmenu = myMenu.Where(x => x.ParentID == null);
foreach (var item in navbarmenu)
{
mainMenuA.InnerText = item.MenuName;
dropdownLi.Controls.Add(mainMenuA);
navUl.Controls.Add(dropdownLi);
}
collapseDiv.Controls.Add(navUl);
containerDiv.Controls.Add(collapseDiv);
navbar.Controls.Add(containerDiv);
StringBuilder htmlStringBuilder = new StringBuilder();
HtmlTextWriter htmlStringWriter = new HtmlTextWriter(new StringWriter(htmlStringBuilder));
navbar.RenderControl(htmlStringWriter);
String output = htmlStringBuilder.ToString();
return output; }
问题是您在循环中一遍又一遍地添加 dropdownLi
和 mainMenuA
的相同实例。我想 Control.Add 不会将重复项添加到列表中,因此控件实际上只添加了一次。在循环的最后 运行 中,将文本更改为最后一项的文本。
为了解决这个问题,您需要按如下方式创建新实例:
foreach (var item in navbarmenu)
{
// Move the following lines from outside the loop inside
HtmlGenericControl dropdownLi = new HtmlGenericControl("li");
dropdownLi.Attributes.Add("class", "dropdown");
HtmlGenericControl mainMenuA = new HtmlGenericControl("a");
mainMenuA.InnerText = item.MenuName;
dropdownLi.Controls.Add(mainMenuA);
navUl.Controls.Add(dropdownLi);
}