如何使用CSS设置asp.net菜单的样式

时间:2010-04-16 18:44:03

标签: asp.net css

我正在设计一个asp.net菜单,我正在尝试理解StaticSelectedStyle-CssClass和StaticHoverStyle-CssClass参数的含义。

我的理解是,在需要时,使用这些参数定义的样式将作为CSS类应用于相关元素。所以我创建了如下菜单:

<asp:Menu ID="NavigationMenu" DataSourceID="NavigationSiteMapDataSource" 
        StaticMenuStyle-CssClass="StaticMenuStyle"
        StaticMenuItemStyle-CssClass="StaticMenuItemStyle"
        StaticSelectedStyle-CssClass="StaticSelectedStyle"
        StaticHoverStyle-CssClass="StaticHoverStyle"
        Orientation="Horizontal" 
        MaximumDynamicDisplayLevels="0" 
        runat="server">
</asp:Menu>

适用于StaticMenuStyle-CssClass和StaticMenuStyle-CssClass(类应用于相关元素),但不应用StaticSelectedStyle-CssClass和StaticHoverStyle-CssClass,无论元素的选定状态或悬停状态如何。

我应该做些什么来完成这项工作?

感谢。

编辑:对不起我应该提到这是.NET 4.这是生成的HTML:

<div id="NavigationMenu">
 <ul class="level1 StaticMenuStyle">
  <li><a class="level1 StaticMenuItemStyle selected" href="/Link.aspx">Link</a></li>
 </ul>
</div>

如您所见,应用StaticMenuStyle和StaticMenuItemStyle,但不应用StaticSelectedStyle-CssClass或StaticHoverStyle-CssClass。不知道为什么。我知道我可以使用selected但不是StaticSelectedStyle-CssClass应用的预期行为???通过使用选择我做出的假设是关于.NET在幕后做什么,这是不对的。

11 个答案:

答案 0 :(得分:35)

我感觉到你的痛苦,我整晚都在浪费,试图解决这个问题。 凭借纯粹的蛮力,我找到了解决方案。称之为解决方法 - 但这很简单。

将CssClass属性添加到Menu Control的声明中,如下所示:

<asp:Menu ID="NavigationMenu" DataSourceID="NavigationSiteMapDataSource"
        CssClass="SomeMenuClass"
        StaticMenuStyle-CssClass="StaticMenuStyle"
        StaticMenuItemStyle-CssClass="StaticMenuItemStyle"
        Orientation="Horizontal" 
        MaximumDynamicDisplayLevels="0" 
        runat="server">
</asp:Menu>

只需删除StaticSelectedStyle-CssClass和StaticHoverStyle-CssClass属性,因为它们根本不执行插孔。

现在创建“SomeMenuClass”,无论你放入什么都没关系。看起来应该是这样的:

.SomeMenuClass
{
    color:Green;
}

接下来添加以下两个CSS类:

对于“悬停”样式添加:

.SomeMenuClass a.static.highlighted
{
    color:Red !important;
}

对于“已选定”样式添加:

.SomeMenuClass a.static.selected
{
    color:Blue !important;
}

那就是它。你完成了。希望这可以节省一些我经历过的挫败感。顺便说一句:你提到过:

  

我似乎是第一个有史以来的人   报告什么似乎是一个错误。

您似乎也认为这是一个新的.NET 4.0错误。我找到了这个: http://www.velocityreviews.com/forums/t649530-problem-with-staticselectedstyle-and-statichoverstyle.html 关于Asp.Net 2.0,于2008年发布。我们这个星球上只有3个人抱怨这个吗?

我如何找到解决方法(研究HTML输出):

当我设置StaticHoverStyle-BackColor =“Red”:

时,这是HTML输出
#NavigationMenu a.static.highlighted
{
    background-color:Red;
}

这是设置StaticSelectedStyle-BackColor =“Blue”时的HTML输出:

#NavigationMenu a.static.selected
{
    background-color:Blue;
    text-decoration:none;
}

因此,覆盖此标记的逻辑方法是为 SomeMenuClass创建类a.static.highlighted SomeMenuClass a.static.selected

特别说明:

你必须在这些类中的所有设置上使用“!important ”,因为HTML输出使用“ #NavigationMenu ”,这意味着任何样式Asp.Net决定投入,因为菜单控件的任何其他样式都具有继承优先级,ID为“ NavigationMenu ”。我努力的一件事就是填充,直到我发现Asp.Net正在使用“ #NavigationMenu ”将左右填充设置为15em。我将“!important ”添加到我的 SomeMenuClass 样式中,并且它有效。

答案 1 :(得分:7)

好的,所以很明显没有很多人在今天尝试过.NET 4菜单。因为最终版本在几天前发布,这并不奇怪。我似乎是第一个报道似乎是一个bug的人。如果我找到时间,我会向MS报告这个问题,但考虑到MS不跟踪错误报告的跟踪记录,我不是急于求成。

无论如何,在这一点上,最差的解决方案是将控件生成的CSS样式(检查标题)复制并粘贴到您自己的样式表中并从那里进行修改。完成此操作后,不要忘记在菜单上设置IncludeStyleBlock =“False”以防止自动生成CSS,因为从现在开始我们将使用复制的块。从概念上讲,这是不正确的,因为您的应用程序不应该依赖于自动生成的代码,但这是我能想到的唯一选择。

答案 2 :(得分:4)

我记得曾经在ASP.NET 2.0中工作的StaticSelectedStyle-CssClass属性。在.NET 4.0中,如果你更改Menu控件的RenderingMode属性“Table”(因此它将菜单呈现为s和sub-s,就像它回到'05那样),它至少会将你指定的StaticSelectedStyle-CssClass写入正确的html元件。

这可能足以让您的网页按照您的意愿工作。然而,我在ASP 4.0中选择菜单项(将RenderingMode保留为默认值)的方法是模仿控件生成的“选定”CSS类,但是给我的“!important”CSS声明,所以我的样式优先于需要的地方。

例如,默认情况下,Menu控件为每个菜单项呈现“li”元素和子元素“a”,并且所选菜单项的“a”元素将包含class =“selected”(以及其他控件生成的CSS类名称,包括“静态”如果它是一个静态菜单项),因此我将自己的选择器添加到页面(或单独的样式表文件)中,用于“静态”和“选择”“a”标签,如下所示:

a.selected.static
{
background-color: #f5f5f5 !important;
border-top: Red 1px solid !important;
border-left: Red 1px solid !important;
border-right: Red 1px solid !important;
} 

答案 3 :(得分:3)

我遇到了“选定”类未添加到菜单项的问题。事实证明,无论出于何种原因,您都无法使用NavigateUrl。

一旦我删除了NavigateUrl,它就将'selected'css类应用于a标签,并且我能够应用背景样式:

div.menu ul li a.static.selected
{
    background-color: #bfcbd6 !important;
    color: #465c71 !important;
    text-decoration: none !important;
}

答案 4 :(得分:2)

只想投入一些东西来帮助人们解决这个问题。 (对我来说至少)css显示它在菜单的每一部分上放置了level1,level2和level3的默认类(级别1是菜单,level2是第一个下拉,level3是第三个弹出)。在css中设置填充

.level2
{
padding: 2px 2px 2px 2px;
}

可以在第一个下拉列表中为每个li添加填充。

答案 5 :(得分:2)

我尝试过MikeTeeVee的解决方案,仍然无法正常工作,我的意思是所选标签仍然没有改变并保持不同的颜色。这篇文章解决了我的问题: Set CSS class 'selected' in ASP.NET menu parents and their children? 需要在代码中加入代码。

答案 6 :(得分:1)

要看的是控制器正在吐出的HTML。在这种情况下,它会发出一个表来创建菜单。悬停样式在TD上设置,一旦您选择菜单项,控件就会回发并将所选样式添加到TD内链接的A标记中。

所以你有两个不同的项目在这里被操纵。一个是TD元素,另一个是A元素。所以,你必须相应地使你的CSS工作。如果我将下面的CSS添加到带有菜单的页面,那么在任何一种情况下我都会得到背景颜色的预期行为。您可能正在进行一些可能适用于这些元素的CSS操作。

<style>
    .StaticHoverStyle
    {
        background: #000000;
    }

    .StaticSelectedStyle
    {
        background: blue;
    }
</style>

答案 7 :(得分:1)

我不知道为什么这里的所有答案都如此令人困惑。我发现了一个非常简单的一个。使用css类作为asp:菜单,比如mainMenu,其下的所有菜单项都是&#34;标签&#34;当呈现为HTML时。所以你只需要提供:将hover属性提供给那些&#34;标签&#34;在你的CSS中。 请参阅下面的示例:

XAML

在CSS中,写一下:

ViewModel

我希望这会有所帮助。 :)

答案 8 :(得分:0)

我对这个破坏的控件的最佳结果包括根本不使用css,而是使用样式的内置控件属性(DynamicMenuItemStyle-BackColor,StaticHoverStyle-Width等)。这是一种糟糕的做法,会使您的代码膨胀,并迫使您为控件的每个实例执行此操作。

但这确实有效。

答案 9 :(得分:0)

您可以尝试使用LevelSubMenuStyles

进行样式设置
            <asp:Menu ID="mainMenu" runat="server" Orientation="Horizontal" 
                StaticEnableDefaultPopOutImage="False">
                <StaticMenuStyle CssClass="test" />
                <LevelSubMenuStyles>
                    <asp:SubMenuStyle BackColor="#33CCFF" BorderColor="#FF9999" 
                        Font-Underline="False" />
                    <asp:SubMenuStyle BackColor="#FF99FF" Font-Underline="False" />
                </LevelSubMenuStyles>
                <StaticMenuItemStyle CssClass="main-nav-item" />
            </asp:Menu>

答案 10 :(得分:-1)

有很好的第三方工具,但我通常使用superfish http://www.conceptdevelopment.net/Fun/Superfish/ 它很酷,免费且容易;)