通过ASP.NET菜单控件禁用javascript生成

时间:2010-08-06 15:54:06

标签: asp.net

在我的网站中,我使用的是标准的ASP.NET菜单控件。我已经编写了一个自定义控件适配器来摆脱默认控件适配器生成的相当俗气的html输出。

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

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

5 个答案:

答案 0 :(得分:4)

在使用vs 2010安装升级到ASP.net 4.0之后,这个问题突然出现了。修复方法是强制菜单呈现为表格或关闭新CSS / javascript 4.0添加的“功能”。将菜单的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的呈现。

答案 1 :(得分: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);
    }
}

这就是诀窍。

答案 2 :(得分:1)

摆脱菜单启动脚本的另一种方法是在Menu 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正在使用适配器,所以蒂姆桑特福德的答案在他的情况下更好。但是如果你想在没有启动代码的情况下将静态菜单呈现为列表,并且没有编写适配器的努力,这可能是另一种选择。

答案 3 :(得分:1)

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

它有效..

在aspx页面中使用它

答案 4 :(得分:0)

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

我想要的是使用jquery superfish 插件,因为我希望它的动画能够流畅地观看。使用ASP.NET生成的javascript, superfish 就行不通了。

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

,即将出现的消息来源:

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

跟踪代码后,将其设置为禁用仍然会在菜单中进行一些样式更改,但不会将事件添加到 MenuItem 。而 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);
}