【问题标题】:Disable javascript generation by ASP.NET menu control通过 ASP.NET 菜单控件禁用 javascript 生成
【发布时间】:2013-05-16 20:11:43
【问题描述】:

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

但有一件事一直困扰着我。不知何故,ASP.NET 正在生成额外的 javascript,我不需要也不需要我的菜单控件,因为我不会使用控件中的任何动态功能。我更换了控制适配器,因此它不会为此生成兼容的 HTML。

有人知道如何防止 ASP.NET 为菜单控件生成额外的 javascript 吗?

【问题讨论】:

    标签: asp.net


    【解决方案1】:

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

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

      成功了。

      【讨论】:

      【解决方案3】:

      摆脱菜单启动脚本的另一种方法是在 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 的回答在他的情况下更好。但是,如果您想在没有启动代码的情况下将静态菜单呈现为列表,并且无需编写适配器,这可能是另一种选择。

      【讨论】:

        【解决方案4】:
        <script type="text/javascript">
            Sys.WebForms.Menu = "";
        </script>
        

        它有效..

        在aspx页面中使用

        【讨论】:

        • 很好的建议,但它会导致一些 JavaScript 错误 - 重新定义函数,即 'Sys.WebForms.Menu = function() {};'做同样的伎俩,但不会导致这些错误。见:stackoverflow.com/a/3264250/1020271
        【解决方案5】:

        我只是打算在搜索 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** });
        

        跟踪代码后,将其设置为禁用仍然会在 Menu 中进行一些样式更改,但不会将事件添加到 MenuItemsuperfish 的动画现在可以工作了。

        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。
        • 对不起,我也找不到办法,只是告诉你,经过上面的设置,我至少可以用jquery和superfish来控制了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多