Я создал динамическое меню на основе файла конфигурации 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?