2010-06-19 50 views
3

我使用Visual Studio 2010和ASP.NET 4.0将Menu控件呈现为HTML列表,以便使用CSS对其进行样式设置。这里是我用下面如何禁用JavaScript中的自定义菜单控件?

<asp:Menu ID="navlist" runat="server" Orientation="Horizontal" 
SkipLinkText="" ClientIDMode="Static" DataSourceID="MenuSource" 
MaximumDynamicDisplayLevels="0" IncludeStyleBlock="False" 
StaticDisplayLevels="2"> 
</asp:Menu> 

代码这将产生以下HTML

<!-- URL shortened --> 
<script src="/WebResource.axd?...t=634066906994188146"type="text/javascript"></script> 

<div id="navlist"> 
    <ul> 
     <li><a href="link1.html">Link 1</a></li> 
     <li><a href="link2.html">Link 2</a></li> 
    </ul> 
</div> 

乍一看,这看起来正是我想要的。但是,如果我打开WebResource.axd,则会出现一大堆与该菜单相关的JavaScript代码。这段代码的一部分是将它自己的内联样式应用到列表中。使用Firebug的JavaScript已被执行之后,我可以查看HTML标记,它看起来是这样的:

<div id="navlist" style="float: left;"> 
    <ul class="level1 static" tabindex="0" style="position: relative; width: auto; float: left;" role="menubar"> 
     <li role="menuitem" class="static" style="position: relative; float: left;"> 
      <a href="link1.html" class="level2 static" tabindex="-1">Link 1</a> 
     </li><li role="menuitem" class="static" style="position: relative; float: left;"> 
      <a href="link2.html" class="level2 static" tabindex="-1">Link 2</a></li> 
    </ul> 
</div> 

这些内嵌样式最终影响到我的网页的布局。我不需要WebResource.axd中的任何脚本。如何防止该脚本在页面的最终标记中呈现?

回答

2

您无法改变Menu控件的开箱即用功能。但是,您可以创建自己的控件或使用CSS Control Adapter Toolkit

+0

谢谢大卫,我会试着去另一个方向 – Cory 2010-06-21 05:08:56

3

我创建了一个自定义菜单(从System.Web.UI.WebControls.Menu派生)和取代的OnPreRender:

public class MyCustomMenu : System.Web.UI.WebControls.Menu 
{ 
    protected override void OnPreRender(EventArgs e) 
    { 
     // Don't call base OnPreRender 
     //base.OnPreRender(e); 
    } 
} 

该诀窍。

5

在你的CSS使用!重要

+0

这真的很简单,非常感谢你的线索!我一整天都在为同样的问题而苦苦挣扎。 – 2016-03-31 23:20:12

8

你可以告诉菜单NOT风格本身,如果你只想使用IncludeStyleBlock属性

默认情况下,它的开启“真”

<asp:Menu IncludeStyleBlock="False" /> 
0

我通过删除内联样式并通过jQuery更改某些类名来管理这个问题。当然,你可以重新设计每一个元素,但它只会产生大量不必要的CSS代码。

利用这一点,如果你想从李一,UL和div的删除这些内嵌样式:

$("#navlist li,#navlist li a,#navlist ul,#navlist div").removeAttr('style'); 

其次,你可以改变这些类的名字,例如:

$("#from-this-element").removeClass(.remove-me).addClass('.new-class'); 

而且我觉得这是在页面加载后使用此脚本的最佳方式。

0

我试图重写asp:menu与自定义类,但还没有学会如何简单地删除从ullia标签的所有属性,这样我可以申请我的CSS代码到一个干净的列表。

Imports Microsoft.VisualBasic 
Namespace MCO 

Public Class MyCustomMenu 
    Inherits Menu 

     Protected Overrides Sub OnPreRender(e As EventArgs) 
      ' don't use this: 
      ' MyBase.OnPreRender(e) 

      ' but leaving this blank produces NO rendered menu 
     End Sub 
    End Class 
End Namespace 

我也曾尝试jQuery的方法:

$("#navlist li,#navlist li a,#navlist ul,#navlist div").removeAttr('style'); 

但由于.NET webresource是最后东西跑,我发现jQuery的线没有工作。它应该,但没有。 :(

+0

考虑不使用'Menu'控件,而是使用纯jQuery菜单小部件。 – 2015-05-05 16:19:36

+0

我已经制定出其他替代方案,当我需要做的是显示一个菜单没有任何过滤。有时候,我必须使用asp:菜单控件,因为它通过活动目录角色进行安全修整。我试图用jQuery隐藏角色匹配(或不匹配)的链接而没有成功。 – 2015-05-08 05:09:13