Доступ к идентификаторам элементов управления неупорядоченного списка в codebehind

#c# #asp.net

#c# #asp.net

Вопрос:

У меня есть элементы ul в usercontrol, как показано ниже

 <u><ul>
  <li id="liMiddle" class="off">
                    <a href="#">One
                    </a>
                    <ul id="One" runat="server">

                </ul>
              </li>
              <li id="liMiddle" class="off">
                <a href="#">Two
                </a>
                <ul id="Two" runat="server">

                </ul>
              </li>
              <li id="liMiddle" class="off">
                <a href="#">Three
                </a>
                <ul id="Three" runat="server">

                </ul>
  

foreach (дополнительный сайт SPWeb в дочерних сайтах)
{
int i = 0;
HtmlGenericControl li = новый HtmlGenericControl(«li»);

                         CurrentTab.Controls.Add(li);

                        HtmlGenericControl anchor = new HtmlGenericControl("a");
                        anchor.Attributes.Add("href", supersubsite.Url);
                        anchor.InnerText = supersubsite.Title;
                        li.Controls.Add(anchor);
                       } </u> 
  

Здесь в каждом цикле текущая вкладка должна быть изменена на соответствующий следующий идентификатор ul. Как получить к нему доступ?

Я должен динамически генерировать элементы ‘li’ в соответствии с приведенными выше ul. Итак, мне нужно получить доступ ко всем идентификаторам ‘ul’ один за другим в codebehind.

Кто-нибудь может подсказать мне решение?

Комментарии:

1. Разве вы не должны иметь доступ к коду за ним? Что я видел, у вас есть Runat =»Server» для ul и задайте id, и он должен быть доступен.

Ответ №1:

Я бы реализовал коллекцию в codebehind, куда вы могли бы добавлять элементы списка с помощью presenter/controller или в page_load/click_events/.. , а затем простым циклом в ASP.NET Стиль MVC..

 // YourPage.aspx.cs:
private readonly ICollection<string> items = new Collection<string> { "one", "two" };

// YourPage.aspx
<ul>
    <% foreach (var stringItem in this.items) { %>
    <li><%= stringItem %></li>
    <% } %>
</ul>
  

Комментарии:

1. Спасибо за ответ. На самом деле я получаю все сайты из sharepoint, и я должен отображать названия этих сайтов в виде вкладок в меню. для этого я использовал структуру ul и li. Каждый сайт может содержать дочерние сайты. Таким образом, дочерние сайты будут отображаться под соответствующим ul. На этом этапе мне нужно получить идентификатор ul и сгенерировать идентификаторы li. Я знаю, как сгенерировать эти идентификаторы li, но не могу получить доступ к идентификаторам ul в foreach.

2. я действительно не понимаю, кажется, у вас есть hyrarchy. Mh .. Вы можете сделать: <%= SomeCodeBehindStringRetunerMethod() %> в вашем aspx, и в этом методе вы генерируете иерархию ul / li / ul / blabla и просто возвращаете html непосредственно на вывод.

3. Я сделал это другим способом. Я просто сохраняю все ul в div и присваиваю идентификатор как ‘mainDiv’. HtmlGenericControl currenttab = (HtmlGenericControl)mainDiv.FindControl(currentSite); Здесь, на текущем сайте, он будет таким же, как мой идентификатор ul. Я получу текущее имя сайта с сайта sharepoint. В любом случае, спасибо за помощь

Ответ №2:

Вы могли бы создать свой собственный класс ListBuilder с помощью метода Add, который принимает пользовательский UserListItem class / struct. Внутри этих классов вы могли бы использовать TagBuilder для создания тегов LI и UL, используя пользовательский класс / структуру, которую вы создали для UserListItem. Вы могли бы хранить статический словарь текущих списков, которые вы создаете, в этом пользовательском классе ListBuilder, используя определенный пользователем ключ.

Таким образом, если вам нужно было получить доступ к вашему списку или элементам списка динамически из исходного кода, вы могли бы просто использовать свой ListBuilder и ссылаться на них по ID.

Приведенный ниже код немного грубоват, но вот общая идея:

 using System.Collections.Generic;
using System.Web.Mvc;
using System;

public class UserList
{
    public List<UserListItem> UserListItems = new List<UserListItem>();
    public void Add(UserListItem item)
    {
        UserListItems.Add(item);
    }
}

public class UserListItem
{
    public string Name { get; set; }
}


public class ListBuilder
{
    static Dictionary<string, UserList> userLists = new Dictionary<string, UserList>();
    public ListBuilder(string listId)
    {
        UserList newList = new UserList();
        newList.Add(new UserListItem() { Name = "Item1" });
        newList.Add(new UserListItem() { Name = "Item2" });
        userLists.Add(listId, newList);
    }
    public static UserList GetList(string listId)
    {
        return userLists[listId];
    }
    public static string BuildList(string listId)
    {
        UserList list = userLists[listId];
        TagBuilder listTagBuilder = new TagBuilder("ul");

        list.UserListItems.ForEach(listItem =>
        {
            TagBuilder listItemTagBuilder = new TagBuilder("li") { InnerHtml = listItem.Name };
            listTagBuilder.InnerHtml  = listItemTagBuilder.ToString(TagRenderMode.Normal);
        });
        return listTagBuilder.ToString(TagRenderMode.Normal);
    }
}