禁用ASP.NET菜单控件生成JavaScript

5
在我的网站中,我正在使用标准的ASP.NET菜单控件。我已经写了一个自定义控件适配器来摆脱默认控件适配器生成的相当粗糙的HTML输出。
但是有一件事情一直困扰着我。由于我不会使用控件中的动态功能,因此ASP.NET正在生成我不需要的额外javascript。我替换了控件适配器,这样它就不会为其生成兼容的HTML。
有人知道我如何防止ASP.NET为菜单控件生成额外的javascript吗?
5个回答

4
这个问题出现在我升级到ASP.net 4.0并安装vs 2010后。解决方法是强制菜单呈现为表格,或者关闭4.0添加的新CSS / javascript“功能”。即使我使用Menu Adapter将控件呈现为列表,将菜单的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>

这将消除asp注入页面底部的内联javascript渲染。

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

那就成功了。

以下类似问题的答案帮助我实现了这个解决方案:https://dev59.com/40XRa4cB1Zd3GeqPtJhh - saturdayplace

1

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

这依赖于使用Reflector发现的菜单类型的内部实现细节,因此有些脆弱。

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

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页面中使用它


很好的建议,但它会导致一些JavaScript错误 - 重新定义函数,即“Sys.WebForms.Menu = function() {};”可以达到同样的效果,但不会引起这些错误。请参见:http://stackoverflow.com/a/3264250/1020271 - Moo

0

我刚刚计划在搜索了2个小时后询问一个类似的问题,但没有运气。

我想要使用jquery superfish插件,因为我想要它平滑的动画效果。但是使用ASP.NET生成的javascript时,superfish就无法工作。

最后,我尝试将ASP.NET菜单控件的属性Enabled = false

输出的源代码如下:

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

对不起,但这仍然涉及到JavaScript。我想完全删除JavaScript。 - Willem Meints
很抱歉,我也找不到其他方法,但是告诉你,在上述设置之后,我至少可以使用jQuery和Superfish来控制它。 - Benedict

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接