asp:菜单在不同的控件执行部分AJAX回发后停止工作

时间:2015-09-03 19:10:30

标签: asp.net ajax

这个问题发生在ASP.NET 4.6中,我看过一些类似的帖子,但是他们通常不会引用相同的控件(这里是内置的)或最终得出结论"只是使用这里有一个不同的/外部的控件:html link",这对我来说不是一个真正的选择。

首先,一些代码

的Site.Master

 <div id="HeaderProper">
    <div id="HeaderProperTitle">
        <asp:Menu ID="HeaderProperMenu" runat="server" DataSourceID="HeaderProperSiteMap" Orientation="Horizontal"  
            BackColor="#ff2400" 
            RenderingMode="List"
            StaticEnableDefaultPopOutImage="false"
            StaticDisplayLevels="2"
            StaticHoverStyle-BackColor="#000000"
            StaticMenuItemStyle-HorizontalPadding="15px"
            StaticMenuItemStyle-Height="42px"
            DynamicHoverStyle-BackColor="#000000" 
            DynamicMenuItemStyle-HorizontalPadding="5px"
            DynamicMenuItemStyle-BackColor="#ff2400"
            DynamicMenuItemStyle-Font-Size="24px"/>
<asp:SiteMapDataSource ID="HeaderProperSiteMap" runat="server" />
</div>

SomePage.aspx页面

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h1>Complete List</h1>
    <div>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <div class="SortOrderSelection">
                    Sort by
                    <asp:DropDownList ID="cbxSortBy" runat="server" AutoPostBack="true"
                        OnSelectedIndexChanged="cbxSortBy_SelectedIndexChanged" />
                </div>
                <asp:Panel ID="SortedList" CssClass="top-margin five-columns" runat="server" />
                <asp:Panel ID="Summary" CssClass="top-margin" runat="server" />
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
</asp:Content>

如何重现: 在DropDownList中选择一个项目,这会导致部分回发。菜单然后停止工作,即 - 下拉/悬停菜单不会打开,但是第一级链接似乎正常运行。刷新整个页面可以解决问题(呃?)。

而且,与我发现的相反: 1)菜单不在UpdatePanel中,我承认这是不受支持的解决方案 2)当RenderingMode设置为Table时,菜单工作正常,但生成一个非常难看的html代码,我想避免。没有提到边距中的额外怪癖,必须通过丑陋的修复进行调整。 3)我尝试设置z-index:1000 ... 0!重要,如某些来源所建议的(在大多数菜单相关的样式上),但无济于事。

如果仍然在列表渲染模式下使用asp:Menu控件,可能会尽可能少地进行干预,我将不胜感激。我的观点是使用内置功能并保持代码清除不必要的JS,jQuery(如果可能的话;否则我会为这个问题打开Connect案例)。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

将菜单放入更新面板应该有效,因为它会指示服务器在回发后更新它。如果没有这个,任何重新发布都可能会导致丢失元素中的某些事件。刷新是有效的,因为您刷新整个页面而不仅仅是它的一些元素。