【问题标题】:Hide / Show menu code not working after postback回发后隐藏/显示菜单代码不起作用
【发布时间】:2025-11-12 03:45:02
【问题描述】:

我的网页上有一个用于切换菜单的按钮,在回发后,尽管我更新了隐藏字段值以存储其状态,但菜单仍会返回。我在这里做错了吗?如果有更好的方法,请告诉我!

标记:

    <asp:Button ID="btnMenu" runat="server" Text="Hide Menu" UseSubmitBehavior="False"
                                        OnClientClick="return toggleMenu(this);" />
    <asp:Panel runat="server" ID="pnlMenuToggle">
        //Main Menu
    </asp:Panel>
    <asp:Panel runat="server" ID="pnlSubMenuToggle">
        //Sub Menu
    </asp:Panel>
    <asp:HiddenField ID="hfMenuState" runat="server" Value="true" />

<script>


//Toggles menu visibility
        function toggleMenu(menuButton) {

            var menuVisible = $('#<%=hfMenuState.ClientID%>').val() == 'true' ? true : false;

            $('#<%=pnlMenuToggle.ClientID%>').slideToggleWidth();
            $('#<%=pnlSubMenuToggle.ClientID%>').slideToggle('slow');

            //Update whether the menu is visible
            menuVisible = !menuVisible;

            //Update menu button text
            $(menuButton).val(menuVisible ? 'Hide Menu' : 'Show Menu');

            $('#<%=hfMenuState.ClientID%>').val(menuVisible)

            return false;
        }
</script>

代码背后:

(页面加载)

        bool menu = Convert.ToBoolean( hfMenuState.Value );

        pnlMenuToggle.Visible = menu;
        pnlSubMenuToggle.Visible = menu;

javascripts 更新隐藏字段的值,但看起来这从未回传到服务器。

我可以做些什么来确保回发后菜单保持隐藏状态。

我还尝试将隐藏字段放在更新模式设置为始终的更新面板中

【问题讨论】:

  • 会不会是回帖的原因。 IE。在做任何事情之前检查 IsPostBack 吗?
  • @Holger - 得到它的工作谢谢,检查我的答案:)

标签: jquery asp.net postback


【解决方案1】:

该按钮具有UseSubmitBehavior="False",因此它永远不会发布到服务器。这就是隐藏字段中的值没有提交的原因。

【讨论】:

  • 啊,你可能有它 - 我想我可能还需要在会话中存储菜单状态,因为每当重新创建页面时它都会被重置。我现在只是在尝试..
  • 好的,我已经从按钮中删除了使用提交行为,但它仍然无法正常工作 - 我不希望隐藏菜单按钮作为它的快速客户端菜单切换回发。但是,当页面回发时,隐藏字段的值发生了变化,它只是在页面加载时忘记了?
  • 页面加载或点击按钮时值改变?
  • 得到它的工作谢谢,我想出了另一个解决方案,使用会话变量结合 ajax 和隐藏值 - 我已经添加了答案:)
【解决方案2】:

好的,这就是我想出的......

母版页:

  <asp:Button ID="btnMenu" runat="server" Text="Hide Menu" UseSubmitBehavior="False" OnClientClick="return toggleMenu(this);" />
        <asp:Panel runat="server" ID="pnlMenuToggle">
            //Main Menu
        </asp:Panel>
        <asp:Panel runat="server" ID="pnlSubMenuToggle">
            //Sub Menu
        </asp:Panel>
        <asp:HiddenField ID="hfMenuVisible" runat="server" Value="true" />

     <script type="text/javascript">


    //Toggles menu visibility
            var _MenuVisible = $('#<%=hfMenuVisible.ClientID%>').val() == 'true' ? true : false;

            function toggleMenu(menuButton) {

                $('#<%=pnlMenuToggle.ClientID%>').slideToggleWidth();
                $('#<%=pnlSubMenuToggle.ClientID%>').slideToggle('slow');

                //Update whether the menu is visible
                _MenuVisible = !_MenuVisible;

                //Update menu button text
                $(menuButton).val(_MenuVisible ? 'Hide Menu' : 'Show Menu');

                //Update menu visibility via ajax
                $.ajax(
                      {
                          type: "POST",
                          url: "Default.aspx/UpdateMenuVisibility",
                          data: "{ 'visible': '" + _MenuVisible + "' }",
                          contentType: "application/json; charset=utf-8",
                          dataType: "json"
                      });

                return false;
            }

</script>

页面加载:

 if ( Default.MenuVisible )
        {
            pnlMenuToggle.Style.Remove( "display" );
            pnlSubMenuToggle.Style.Remove( "display" );
            btnMenu.Text = "Hide Menu";
            hfMenuVisible.Value = true.ToString().ToLower();
        }
        else
        {
            pnlMenuToggle.Style.Add( "display", "none" );
            pnlSubMenuToggle.Style.Add( "display", "none" );
            btnMenu.Text = "Show Menu";
            hfMenuVisible.Value = false.ToString().ToLower();
        }

Default.aspx:

/// <summary>
    /// Gets or Sets whether the Menu Is Visible
    /// </summary>
    public static bool MenuVisible
    {
        get
        {
            if ( HttpContext.Current.Session[ "MenuVisible" ] == null )
            {
                HttpContext.Current.Session[ "MenuVisible" ] = true;
            }

            return ( bool ) HttpContext.Current.Session[ "MenuVisible" ];
        }
        set
        {
            HttpContext.Current.Session[ "MenuVisible" ] = value;
        }
    }

    /// <summary>
    /// Updates whether the menu is visible or not
    /// </summary>
    /// <param name="visible">visible</param>
    [WebMethod, ScriptMethod]
    public static void UpdateMenuVisibility( bool visible )
    {
        try
        {
            Default.MenuVisible = visible;
        }
        catch ( Exception )
        {
            throw;
        }
    }

基本上,隐藏显示菜单按钮现在更新会话变量以跟踪菜单是否在回发之间可见,即使重新创建母版页也是如此。

这是一种享受。

【讨论】:

  • 它帮助我找到了适合我的应用程序的解决方案。我做了一些改变,效果很好。谢谢
最近更新 更多