我正在使用Visual Studio 2008和ASP.NET 3.5编写一个网站。我设置了一个母版页来简化布局并保留内容页面而不是内容和布局。
导航是列表,css,所以它看起来像一个栏。为了突出显示栏上的页面,列表项需要看起来像<li id="current">
。如果可以避免,我不想使用<asp:ContentPlaceHolder>
。是否有一些代码可以添加到我的每个页面(或者只是添加到母版页?)来实现这一点,还是我使用<asp:ContentPlaceHolder>
了?
答案 0 :(得分:13)
您是否考虑过使用Web.sitemap文件?这真的很容易。如果您的站点地图文件看起来像这样......
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode>
<siteMapNode url="~/Default.aspx" title="Home" description="" />
<siteMapNode url="~/Blog.aspx" title="Blog" description="" />
<siteMapNode url="~/AboutUs.aspx" title="AboutUs" description="" />
</siteMapNode>
</siteMap>
...然后您可以在母版页中执行此操作以获得所需的结果:
<asp:SiteMapDataSource ID="sitemapdata" runat="server" ShowStartingNode="false" />
<ul id="navigation">
<asp:Repeater runat="server" ID="navrepeater" DataSourceID="sitemapdata">
<ItemTemplate>
<li class="<%# SiteMap.CurrentNode.Equals(Container.DataItem) ? "activenav" : "inactivenav" %>"><a href="<%# DataBinder.Eval(Container.DataItem, "url") %>"><%# DataBinder.Eval(Container.DataItem, "title") %></a></li>
</ItemTemplate>
</asp:Repeater>
</ul>
当前页面的LI将有一个“activenav”类(或者你决定使用的任何东西),其他的将有一个“inactivenav”类。你可以相应地编写你的CSS。这是我在我的网站上使用的技术,效果很好。
答案 1 :(得分:10)
将属性添加到名为Page Section
的母版页public string PageSection { get; set; }
将MasterType页面指令添加到内容页面的顶部
<%@ MasterType VirtualPath="~/foo.master" %>
在您的内容页面代码中,设置母版页的PageSection属性
Master.PageSection = "home";
在您的母版页中,将正文标记设为服务器标记
<body ID="bodyTag" runat="server">
在后面的母版页代码中,使用该属性在body标签上设置类
bodyTag.Attributes.Add("class", this.PageSection);
为每个导航项目指定唯一的ID属性。
在您的css中,根据当前页面类
更改导航项的显示.home #homeNavItem,
.contact #contactNavItem
{
color: #f00;
}
答案 2 :(得分:3)
这是一个更好的语义匹配,可能是一个更容易设置的变量,用于保持导航使用相同的类或ID到处,只改变body元素的id来匹配:
<li id="homeNav">home</li>
<li id="blogNav">blog</li>
然后在每个页面上......
<body id="home">
<body id="blog">
在css中:
#home #homeNav {background-image:url(homeNav-on.jpg);}
#blog #blogNav {background-image:url(blogNav-on.jpg);}
答案 3 :(得分:0)
使用或不使用ContentPlaceHolder不会影响在其上设置id =“current”的元素。
在创建菜单组件时,无论是在母版页的代码隐藏,javascript函数还是其他内容中,都必须查看一些方法,以便在创建时正确地将id =“current”添加到列表中。 / p>
答案 4 :(得分:0)
如何在母版页代码类中创建受保护的字符串属性?覆盖OnLoad:
protected string _bodyId;
protected override void OnLoad(EventArgs e)
{
_bodyId = "your css id name";
}
然后在你的母版页面aspx:
<body id="<%= _bodyId %>">
然后你不必乱用你的CSS,特别是如果CSS来自设计机构时很有用。
答案 5 :(得分:0)
以下是我们如何使用JQuery通过附加css类来改变背景来实现它。
$("ul.nav > li > a:contains('<%= SiteMap.CurrentNode.ParentNode.Title %>')").addClass("navselected");
.nav
中的“ul.nav
”(在Jquery中)是应用于UL标记的css类。
:contains
帮助检查ul-&gt; li-&gt; a中所有“a”标签/元素的内容,其中包含在菜单中打印的ParentNode标题...
如果找到,请将名为navselected的css类应用于特定的ul-&gt; li-&gt;标记/元素。
此致,Minesh Shah
Systems Plus Pvt。有限公司
www.systems-plus.com
答案 6 :(得分:-2)
我会用javascript来完成这个。在css中,将#current更改为类(.current),然后在您创建的每个ListItem上都有id。然后使用RegisterStartupScript调用一个获取相应ListItem的javascript方法,并为其指定一种当前样式。使用Prototype,这看起来像$('MyPageLi')。className ='current'。