我已经为Web应用程序基于JSON配置文件创建了一个动态菜单。这是为了允许我的客户端在必要时启用和禁用用户模块。菜单是在用户登录时使用HTMLControl
对象构建的,并存储在会话“捆绑包”中,以便通过Page_Load
方法注入到每个页面中。
我这样创建菜单:
public HtmlGenericControl buildMenu(string config, string rootpath)
{
//Get the list of installed modules from the config file
List<activeModule> Modules = new List<activeModule>();
//Add the mandatory modules
addStandardModules(Modules);
//Parse the rest of the modules from the config and add them to the list of modules
JObject ModuleList = JObject.Parse(config);
IList<JToken> modules = ModuleList["modules"].Children().ToList();
foreach (JToken module in modules)
{
activeModule aModule = module.ToObject<activeModule>();
Modules.Add(aModule);
}
HtmlGenericControl MenuContainer = new HtmlGenericControl("div");
MenuContainer.Attributes["id"] = "menucontainer";
//Use the list of modules to build a menu
foreach (activeModule module in Modules.Where(module => module.Enabled == true))
{
HtmlGenericControl menuItemContainer = new HtmlGenericControl("div");
menuItemContainer.Attributes["class"] = "menuitem";
HtmlGenericControl menuTextContainer = new HtmlGenericControl("div");
menuTextContainer.Attributes["class"] = "menuitemtext";
menuItemContainer.Controls.Add(menuTextContainer);
HtmlAnchor hyperlink = new HtmlAnchor();
hyperlink.InnerText = module.Name;
hyperlink.Attributes.Add("href", rootpath + module.Location);
menuTextContainer.Controls.Add(hyperlink);
HtmlGenericControl menuImageContainer = new HtmlGenericControl("div");
menuImageContainer.Attributes["class"] = "menuimg";
menuItemContainer.Controls.Add(menuImageContainer);
HtmlImage image = new HtmlImage();
image.Src = rootpath + module.Iconpath;
menuImageContainer.Controls.Add(image);
MenuContainer.Controls.Add(menuItemContainer);
}
return MenuContainer;
}
调用菜单时,它是通过会话捆绑包中名为MenuContainer
的变量来完成的,就像这样:
protected void Page_Load(object sender, EventArgs e)
{
menucontainer.Controls.Add(variables.MenuContainer);
}
第一次加载带有菜单的页面时,菜单会正确显示,每个锚点都指向正确的位置,并且加载了每个图标。但是,第二次加载后,每个<a>
元素都会丢失其href
值。此外,每个<img>
标签都会丢失其src
值。
您可能会注意到,我已经显示了使用Attributes.Add(string, string)
的示例。我首先尝试使用HRef = <string>
,然后尝试Attributes["href"] = <string>
。整个行为都是一样的。
可能是什么原因造成的?此外,这是一个值得解决的问题,还是应该用Javascript重写?