2010-08-06 113 views
5

在我的网站中,我使用标准的ASP.NET菜单控件。我已经写了一个自定义控制适配器来摆脱由默认控制适配器生成的相当麻烦的html输出。通过ASP.NET菜单控件禁用JavaScript生成

有一件事情让我烦恼不已。不知何故,ASP.NET正在生成额外的JavaScript,我不需要我的菜单控件,因为我不会使用控件中的任何动态功能。我更换了控制适配器,因此它不会为此生成兼容的HTML。

任何人都知道如何防止ASP.NET为菜单控件生成额外的JavaScript?

回答

4

此问题出现了,我升级到ASP.net 4.0后安装的VS 2010的修复方法是强制菜单呈现为一个表或关闭新的CSS/4.0增加的javascript“功能”。将菜单的RenderingMode属性设置为“Table”可以解决此问题,即使我使用菜单适配器来使用列表呈现控件。

<asp:Menu ID="mnuStuff" runat="server" RenderingMode="Table"> 
    ... 
</asp:Menu> 

您可以在web.config做这个网站范围的设置controlRenderingCompatibilityVersion到3.5

<system.web> 
    <pages controlRenderingCompatibilityVersion="3.5"/> 
</system.web> 

这将消除内嵌的渲染JavaScript代码的ASP页面的基础注射。

0

我只是打算在2个小时的搜索后问一个类似的问题,没有运气。

我想要的是使用jquery superfish插件,因为我希望它的动画顺畅。而使用ASP.NET生成的javascript,superfish就不起作用。

最后,我尝试设置ASP.NET菜单的控件的属性启用=假

和outcoming源变成这样:

new Sys.WebForms.Menu({ element: 'mysitemeun', disappearAfter: 500, orientation: 'horizontal', tabIndex: 0, disabled: **true** }); 

跟踪代码,设置禁用它仍然有后菜单中的一些样式更改,但不会将事件添加到菜单项。而现在,动画作品superfish的正常运作。

if (!this.container.disabled) { 
    Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseover', Sys.WebForms.MenuItem._onmouseover); 
    Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseout', Sys.WebForms.MenuItem._onmouseout); 
} 
+0

我很抱歉,但是这仍然涉及的JavaScript。我想完全删除JavaScript。 – 2010-09-09 11:21:03

+0

对不起,我找不到方法,但只是告诉你,在上述设置后,我至少可以使用jquery和superfish来控制它。 – Benedict 2010-09-10 01:42:16

2

如果您更喜欢使用ASP.Net 4.0控制渲染,你可以创建一个自定义菜单(从System.Web.UI.WebControls.Menu派生)和更换的OnPreRender:

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

那做了招。

+1

如何使用此代码片段? – 2012-08-26 06:45:41

+0

以下对类似问题的回答帮助我实现了此解决方案:http://stackoverflow.com/questions/232934/subclassing-dropdownlist-in-asp-net – saturdayplace 2012-11-01 19:19:46

1

摆脱菜单启动脚本的另一种方法是在Menu PreRender事件之前调用RegisterStartup脚本方法,使用相同的脚本键并输出虚拟脚本(或空脚本)。

这依赖于使用反射器发现的菜单类型的内部实现细节,所以有点脆弱。

例如,一个静态类,看起来像:

static MenuHelper 
{ 
    private static Type _rendererType = 
      typeof(Menu).Assembly.GetType(
       typeof(Menu).FullName + "+MenuRendererStandards" 
      ); 

    public static void RemoveMenuScript(Menu menu) 
    { 
     string dummyScript = "<!-- Removed Menu Startup script -->"; 
     string key = "_registerMenu_" + menu.ClientID; 
     ScriptManager.RegisterStartupScript(menu, _rendererType, key, dummyScript, false); 
    } 
} 

,那么你只需要确保你的菜单的PreRender事件之前调用MenuHelper.RemoveMenuScript(menu)

OP使用的是适配器,因此Tim Santeford的回答在他的情况下更好。但是,如果您想将静态菜单呈现为没有启动代码的列表,并且没有编写适配器的努力,这可能是另一种选择。

1
<script type="text/javascript"> 
    Sys.WebForms.Menu = ""; 
</script> 

它的工作原理..

使用它在aspx页面

+0

很棒的建议,但它会导致一些JavaScript错误 - 重新定义函数,即'Sys.WebForms.Menu = function(){};'做同样的技巧,但不会导致这些错误。请参阅:http://stackoverflow.com/a/3264250/1020271 – Moo 2014-08-13 18:30:59