我正在根据从数据库中获取的安全权限动态构建导航栏。数据库查找包括页面名称。最初我使用的是datareader并执行以下操作:
SqlDataReader SRmenu = sqlCMD.ExecuteReader();
HtmlGenericControl liToAdd;
if (SRmenu.HasRows)
{
while (SRmenu.Read())
{
liToAdd = new HtmlGenericControl("li");
MainUL1.Controls.Add(liToAdd);
HtmlGenericControl addpage = new HtmlGenericControl("a");
addpage.Attributes.Add("href", Convert.ToString(SRmenu["PageName"]));
addpage.InnerText = Convert.ToString(SRmenu["Name"]);
liToAdd.Controls.Add(addpage);
}
}
SRmenu.Close();
conn.Close();
这完全正常,直到我想添加可能的下拉菜单(对于具有多个页面的人可以访问的部分)。我的更新代码在
下面if (SRmenu.HasRows)
{
while (SRmenu.Read())
{
LoopCount = LoopCount + 1;
Int32 AppCount = Convert.ToInt32(SRmenu["AppCount"]);
if (AppCount > 1)
{
Int32 ApplicationID = Convert.ToInt32(SRmenu["ApplicationID"]);
Int32 ApplicationID2 = Convert.ToInt32(SRmenu["ApplicationID"]);
liToAdd = new HtmlGenericControl("li");
liToAdd.Attributes.Add("class", "dropdown");
MainUL1.Controls.Add(liToAdd);
HtmlGenericControl addhref = new HtmlGenericControl("a");
addhref.Attributes.Add("href", Convert.ToString(SRmenu["PageName"]));
addhref.InnerText = Convert.ToString(SRmenu["Name"]);
liToAdd.Attributes.Add("class", "dropdown-toggle");
addhref.Attributes.Add("data-toggle", "dropdown");
liToAdd.Controls.Add(addhref);
HtmlGenericControl addspan = new HtmlGenericControl("span");
addspan.Attributes.Add("class", "caret");
addhref.Controls.Add(addspan);
HtmlGenericControl addUL = new HtmlGenericControl("ul");
addUL.Attributes.Add("class", "dropdown-menu");
liToAdd.Controls.Add(addUL);
while (ApplicationID == ApplicationID2)
{
HtmlGenericControl addDropDown = new HtmlGenericControl("li");
addUL.Controls.Add(addDropDown);
HtmlGenericControl addpage = new HtmlGenericControl("a");
addpage.Attributes.Add("href", Convert.ToString(SRmenu["PageName"]));
addpage.InnerText = Convert.ToString(SRmenu["Name"]);
addDropDown.Controls.Add(addpage);
SRmenu.Read();
if (LoopCount < FieldCount)
{ ApplicationID2 = Convert.ToInt32(SRmenu["ApplicationID"]); }
else
{ ApplicationID2 = 0; }
LoopCount = LoopCount + 1;
}
}
else
{
liToAdd = new HtmlGenericControl("li");
MainUL1.Controls.Add(liToAdd);
HtmlGenericControl addpage = new HtmlGenericControl("a");
addpage.Attributes.Add("href", Convert.ToString(SRmenu["PageName"]));
addpage.InnerText = Convert.ToString(SRmenu["Name"]);
liToAdd.Controls.Add(addpage);
}
}
}
我遇到的问题是在READ()循环中添加一个循环。目前我正在尝试使用While(ApplicationID == ApplicationID2)循环,这让我得到第一个值而不是第二个(当前只有两个页面属于同一个ApplicationID,它们是我的最后两个记录Read()循环) - 问题是第二个值永远不会进入下拉列表。
当我在调试中运行它时,它不会经历第二个循环,它会击中&#39; if(SRmenu.HasRows)&#39;它无法找到额外的行,因此它存在循环 - 如果我注释掉整个IF / ELSE并返回到我的原始代码,它确实会看到所有预期的页面,因此数据存在。
我知道如何在经典ASP中实现这一点,但我很难在C#/ ASP.NET中找到类似的解决方案。我在经典中所做的就像是
RSMenu.open
do while not RSMenu.EoF
if PageCount>1 then
<code for drop down segment>
do while count < PageCount
<LI HTML Code>
RSMenu.MoveNext
loop
else
<LI HTML Code>
end if
RSMenu.MoveNext
loop
编辑
答案 0 :(得分:0)
我做了上面的最终编辑以包含但问题是我试图使用.NEXTRESULT(),它用于迭代一批查询。 .READ()将迭代到下一条记录。
我还发现.HASROWS只检查读者是否有,而不是是否还有记录。所以我在read()开始和循环计数之前添加了一个fieldcount。
我觉得有更好的方法可以做到这一点,并且可能会看到在循环之外拉出HTML声明,然后看看我是否可以从内部正确地添加它们 - 但是现在这是有效的。