Подтвердить что ты не робот

С# - Как изменить атрибуты элементов HTML

Моя главная страница содержит список, как показано здесь. Что бы я хотел сделать, добавьте атрибут class= active в список li, который в настоящее время активен, но я понятия не имею, как это сделать. Я знаю, что код идет в aspx page page_load, но не знаю, как получить доступ к li. Мне нужно добавить атрибут. Пожалуйста, просветите меня. Большое спасибо.

<div id="menu">
  <ul id="nav">
    <li class="forcePadding"><img src="css/site-style-images/menu_corner_right.jpg" /></li>               
    <li id="screenshots"><a href="screenshots.aspx" title="Screenshots">Screenshots</a></li>
    <li id="future"><a href="future.aspx" title="Future">Future</a></li>
    <li id="news"><a href="news.aspx" title="News">News</a></li>
    <li id="download"><a href="download.aspx" title="Download">Download</a></li>
    <li id="home"><a href="index.aspx" title="Home">Home</a></li>
    <li class="forcePadding"><img src="css/site-style-images/menu_corner_left.jpg" /></li>
  </ul>
</div>
4b9b3361

Ответ 1

Чтобы получить доступ к этим элементам управления со стороны сервера, вам необходимо сделать их runat = "server"

<ul id="nav" runat="server">
  <li class="forcePadding"><img src="css/site-style-images/menu_corner_right.jpg" /></li>               
  <li id="screenshots"><a href="screenshots.aspx" title="Screenshots">Screenshots</a></li>
  <li id="future"><a href="future.aspx" title="Future">Future</a></li>
  <li id="news"><a href="news.aspx" title="News">News</a></li>
  <li id="download"><a href="download.aspx" title="Download">Download</a></li>
  <li id="home"><a href="index.aspx" title="Home">Home</a></li>
  <li class="forcePadding"><img src="css/site-style-images/menu_corner_left.jpg" /></li>
</ul>

в коде:

foreach(Control ctrl in nav.controls)
{
   if(!ctrl is HtmlAnchor)
   {
      string url = ((HtmlAnchor)ctrl).Href;
      if(url == GetCurrentPage())  // <-- you'd need to write that
         ctrl.Parent.Attributes.Add("class", "active");
   }
}

Ответ 2

Код ниже может использоваться для поиска именованного элемента управления в любом месте иерархии управления:

public static Control FindControlRecursive(Control rootControl, string id)
{
    if (rootControl != null)
    {
        if (rootControl.ID == id)
        {
            return rootControl;
        }

        for (int i = 0; i < rootControl.Controls.Count; i++)
        {
            Control child;

            if ((child = FindControlRecursive(rootControl.Controls[i], id)) != null)
            {
                return child;
            }
        }
    }

    return null;
}

Итак, вы можете сделать что-то вроде:

Control foundControl= FindControlRecursive(Page.Master, "theIdOfTheControlYouWantToFind");
((HtmlControl)foundControl).Attributes.Add("class", "active");

Вспомним ранее, что вам нужен runat = "server" на любом элементе управления, который вы хотите найти таким образом =)

Ответ 3

Добавьте runat = "server" в теги li на главной странице, затем добавьте это в соответствующее событие page_load, чтобы добавить класс 'active' в li на главной странице

HtmlGenericControl li = HtmlGenericControl) Page.Master.FindControl( "скриншоты" ); li.Attributes.Add( "класс", "активный" );

Ответ 4

Вы можете зарегистрировать клиент script следующим образом:

(установите id на идентификатор li, который вы хотите установить на активный)

ClientScript.RegisterStartupScript(this.GetType(), "setActiveLI", "document.getElementById(\""+id+"\").setAttribute(\"class\", \"active\");", true);

Это генерирует вызов JavaScript на странице в нижней части страницы после того, как элементы уже были обработаны.

Ответ 5

Все части уже предоставлены в предыдущих ответах, но чтобы собрать все это вместе, вам необходимо:

добавить атрибут runat = "server" к элементам <ul> и <li> добавить общедоступный метод для выполнения работы на главной странице, которая может быть вызвана со страниц с использованием главной страницы вызов метода из страницы_Load страниц

В качестве альтернативы вы также можете добавить код к методу OnLoad (...) главной страницы, поэтому вам не нужно добавлять вызов метода к странице_Load на каждой странице.

Ответ 6

Если они были runat = server, вы можете использовать свойство attributes.

Ответ 7

Чтобы найти этот конкретный элемент управления, он должен быть определен как открытый (в сгенерированном конструкторе)

Или нужно будет обернуть публичный доступ в код.

Ответ 8

Вы можете разоблачить ли на главной странице любые страницы содержимого, завернув их в свойства на главной странице:

public GenericHtmlControl Li1
{
    get
    {
        return this.LiWhatever;
    }
}

Затем на странице содержимого:

MasterPage2 asd = ((MasterPage2)Page.Master).Li1.Attributes.Add("class", "bla");

Если у меня все получилось!

Ответ 9

Я нашел ссылку, которая работает с использованием CSS и включает только изменение атрибута класса тега body. Это означает, что нет Javascript и нет для циклов или чего-то еще.

#navbar a:hover,
  .articles #navbar #articles a,
  .topics #navbar #topics a,
  .about #navbar #about a,
  .contact #navbar #contact a,
  .contribute #navbar #contribute a,
  .feed #navbar #feed a {
 background: url(/pix/navbarlinkbg.gif) top left repeat-x; color: #555;
}

....

<body class="articles" onload="">

<ul id="navbar">
  <li id="articles"><a href="/articles/" title="Articles">Articles</a></li>
  <li id="topics"><a href="/topics/" title="Topics">Topics</a></li>
  <li id="about"><a href="/about/" title="About">About</a></li>
  <li id="contact"><a href="/contact/" title="Contact">Contact</a></li>
  <li id="contribute"><a href="/contribute/" title="Contribute">Contribute</a></li>
  <li id="feed"><a href="/feed/" title="Feed">Feed</a></li>
</ul>

Подробнее здесь http://www.websiteoptimization.com/speed/tweak/current/

Ответ 10

Попробуйте это отличный пример для будущего использования. Я знаю, что эта ветка устарела, но для будущих запросов...

http://community.discountasp.net/showthread.php?p=33271

Ответ 11

Спасибо За решение.

Минимизированный код.

Управление главной страницей также можно найти на дочерней странице.

i означает, что главная страница содержит html contol

и страница chilld может найти мастер-страницу html conrol, как это

((HtmlControl)this.Master.FindControl("dpohome1")).Attributes.Add("class", "on");

Ответ 12

Простая логика и минимальный код, я обычно использую следующий код, особенно в динамическом меню. Надеюсь, это поможет.

Создайте этот код метода в коде за главной страницей

Код позади (С#)

protected string SetCssClass(string page) { return Request.Url.AbsolutePath.ToLower().EndsWith(page.ToLower()) ? "active" : ""; }

В созданных вами элементах списка меню вызовите этот метод, передав имя страницы следующим образом:

HTML PAGE (встроенный код ASPX)

<li id="screenshots" class = "<%= SetCssClass("screenshots.aspx") %>"> <a href="screenshots.aspx" title="Screenshots">Screenshots</a></li>

<li id="future" class = "<%= SetCssClass("future.aspx") %>"> <a href="future.aspx" title="Future">Future</a></li>

и так далее.

С помощью этого метода каждый раз, когда вы добавляете страницу и ссылку, вам не нужно писать код на каждой странице. Просто, когда вы добавляете ссылку на главную страницу, каждый <li> вызывает вызов метода SetCssClass(pagename) для установки класса, и это делается. (Вы можете переименовать метод в соответствии с вашей легкостью.

Вы можете использовать более длинные коды, если вам платят за строки кода bcoz, тогда это всего лишь одна строка кода. (лол). Просто шучу. Надеюсь, это поможет.

Примечание: я игнорирую другие части HTML-кода, вы также можете включить их, что будет работать нормально.