C#-如何更改HTML元素属性

C#-如何更改HTML元素属性,c#,html,asp.net,C#,Html,Asp.net,我的母版页包含一个列表,如下所示。但是我想做的是,将“class=active”属性添加到当前活动的列表中,但我不知道如何做。我知道代码会出现在aspx页面的page_load事件中,但不知道如何访问我需要添加属性的li。请开导我。非常感谢 <div id="menu"> <ul id="nav"> <li class="forcePadding"><img src="css/site-style-images/menu_corner_rig

我的母版页包含一个列表,如下所示。但是我想做的是,将“class=active”属性添加到当前活动的列表中,但我不知道如何做。我知道代码会出现在aspx页面的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>


如果它们是在=服务器上运行的,则可以使用attributes属性。

您可以像这样注册客户端脚本:

(将id设置为要设置为活动的li的id)


这将在元素已经呈现之后在靠近底部的页面上生成JavaScript调用。

为了找到特定控件,需要将其定义为public(在生成的设计器中)


或者需要在代码隐藏中使用公共get进行包装。

您可以通过在母版页上的属性中包装,将母版页上的li公开给任何内容页:

public GenericHtmlControl Li1
{
    get
    {
        return this.LiWhatever;
    }
}
然后在内容页上:

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

如果我没弄错的话

以下代码可用于在控件层次结构中的任何位置查找命名控件:

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;
}

忘了前面提到的,您确实需要在任何控件上运行at=“server”,以便通过这种方式找到=)

为了从服务器端访问这些控件,您需要使它们运行at=“server”

在代码隐藏中:

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");
   }
}
foreach(导航控件中的控件ctrl)
{
如果(!ctrl为HtmlAnchor)
{
字符串url=((HtmlAnchor)ctrl).Href;

如果(url==GetCurrentPage())/前面的答案中已经提供了所有部分,但是要将整个内容放在一起,您需要:
  • 将runat=“server”属性添加到
  • 元素中
  • 添加一个公共方法来完成母版页上的工作,该工作可以从使用母版页的页面调用
  • 从页面的页面加载调用该方法


    或者,您也可以将代码添加到母版页的OnLoad(…)方法中,这样您就不必在每个页面上都向页面加载添加方法调用。

    我发现了一个使用CSS的链接,只涉及更改body标记的class属性。这意味着没有Javascript,也没有for循环或其他内容

    #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>
    
    导航栏a:悬停, .文章#导航栏#文章a, .主题#导航栏#主题a, .关于#导航栏#关于, .联系#导航栏#联系a, .投稿#导航栏#投稿, .feed#导航栏#feed a{ 背景:url(/pix/navbarlinkbg.gif)左上角repeat-x;颜色:#555; } ....
  • 在这里阅读更多

    在母版页的li标记上添加runat=“server”,然后将其添加到相应的页面加载事件中,以将“active”类添加到母版页的li中

    HtmlGenericControl li=HtmlGenericControl)Page.Master.FindControl(“屏幕截图”); li.Attributes.Add(“class”,“active”);

    试试这个 这是未来使用的好例子。我知道这个线程很旧,但对于将来的查询


    谢谢您的解决方案

    精简代码

    母版页控件也可以在子页中找到

    我的意思是母版页包含html控件

    Chill page可以找到母版页html控件,如下所示

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

    简单的逻辑和最少的代码,我通常使用下面的代码,特别是在动态菜单中。希望这有帮助

    在代码隐藏母版页中创建此方法代码

    代码隐藏(C#)

    protectedstringsetcsclass(字符串页)
    {
    return Request.Url.AbsolutePath.ToLower().EndsWith(page.ToLower())?“活动”:“”;
    }

    在菜单列表中,您创建的项调用此方法,并按如下方式传递页面名称

    ((HtmlControl)this.Master.FindControl("dpohome1")).Attributes.Add("class", "on");
    
    HTML页面(ASPX内联代码)

  • 等等

    通过此方法,每次添加页面和链接时,您不必在每个页面中编写代码。仅当您在母版页中添加链接时,使用每个
  • 调用
    setcsclass(pagename)
    方法调用来设置类,就完成了。(您可以根据自己的轻松程度重命名该方法)

    你可以使用更长的代码,如果你被支付每行代码bcoz,那么这只是一行代码。(lol)。只是开玩笑。希望它能帮助你


    注意:我忽略了html代码的其他部分,您也可以包含它们,这样可以很好地工作。

    隐藏的代码是指母版页还是内容页?
    #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>
    
    ((HtmlControl)this.Master.FindControl("dpohome1")).Attributes.Add("class", "on");