Asp.net DropDownList不维护“的视图状态”;“用户模式菜单”;选择器

Asp.net DropDownList不维护“的视图状态”;“用户模式菜单”;选择器,asp.net,menu,drop-down-menu,postback,viewstate,Asp.net,Menu,Drop Down Menu,Postback,Viewstate,我会保持简单。出于开发目的,我想创建代表各种用户类型的“模式”,它们将相应地看到不同的菜单栏。我得到了我想要的一切,除了在选择了我想要操作的“模式”之后,只要我点击一个菜单项,它就会忘记它所处的“模式”,并用默认菜单栏刷新。我假设这是ViewState在回发过程中未正确维护的问题?我已经搜索了所有的论坛和其他地方,不知道如何实现我想要的。这是我的代码和代码隐藏 我在页面加载中添加了以下内容: If Not IsPostBack Then modeMenu.SelectedValue =

我会保持简单。出于开发目的,我想创建代表各种用户类型的“模式”,它们将相应地看到不同的菜单栏。我得到了我想要的一切,除了在选择了我想要操作的“模式”之后,只要我点击一个菜单项,它就会忘记它所处的“模式”,并用默认菜单栏刷新。我假设这是ViewState在回发过程中未正确维护的问题?我已经搜索了所有的论坛和其他地方,不知道如何实现我想要的。这是我的代码和代码隐藏

我在页面加载中添加了以下内容:

If Not IsPostBack Then
    modeMenu.SelectedValue = Session("mode")
End If
编辑:除了代码后面的一行之外,其余内容都是相同的。感谢TC的回答:)

就像我说的,问题是在选择了我的模式后,一旦我尝试使用菜单,它就会刷新并忘记模式

编辑:此外,我还添加了以下CSS以消除模式菜单的影响。它像这样工作得很好。非常便于开发。:)


属性
Visible
未存储在ViewState中。为了记住它,您应该在
页面加载()
事件处理程序中放置一些内容。

如果我理解正确(我从未使用过菜单控件),问题是单击菜单项会导致您导航到新的URL。ViewState仅在回发之间存在,而不是在对新URL的“新”访问之间存在。尝试改用。

您可以使用cookie存储您的模式吗

当用户选择模式时,将值存储在cookie中。之后加载任何页面时,请在页面加载事件中检查cookie并适当设置模式


如果您熟悉Jquery,也可以使用Jquery cookie插件,这样您的页面就不必在创建cookie时发回了。

我猜您是在尝试创建级联DDL吧?如果是这样,您需要超越LoadViewState和SaveViewState,并在那里操纵您的ViewState:)

Mmm。。。可能不会吧?这可能是另一种方式,但不知道。如果其他方法不起作用,我稍后会尝试你的想法:)无论哪种方法,在使用DDL、单选按钮列表等时,你仍然需要覆盖这两种方法。@Irishcieftan:我会记住这一点。谢谢bud:)没有问题,这些特定控件在保留ViewState(可能是生命周期问题)时似乎有问题,而且我看不到任何文档:)不,我更喜欢服务器端维护的模式。您确实意识到,如果您将此存储在会话状态,它仅在用户访问期间有效。Cookie确实记得他们回来时的模式。如果要将其存储在服务器端,也可以将其存储在数据库中。。但这一切都取决于你的要求,你更清楚@TC:我在让它工作时遇到了一些问题,但我会进一步研究,然后再试一次。@TC:Ack,难怪。我一直在尝试使用SessionState(名称空间)而不是Session(对象)doh!非常感谢你让我再次审视我的错误。干杯:)
<asp:Menu ID="mode1Nav" runat="server" CssClass="menu" 
    Visible="False" ViewStateMode="Enabled">
    <Items>
        <asp:MenuItem NavigateUrl="~/Home1.aspx" />
        <asp:MenuItem NavigateUrl="~/DoSomething1.aspx" />
    </Items>
</asp:Menu>
<asp:Menu ID="mode2Nav" runat="server" CssClass="menu" 
    Visible="False">
    <Items>
        <asp:MenuItem NavigateUrl="~/Home2.aspx" />
        <asp:MenuItem NavigateUrl="~/DoSomething2.aspx" />
    </Items>
</asp:Menu>
<asp:DropDownList ID="modeMenu" runat="server" AutoPostBack="True" 
    ViewStateMode="Enabled" CssClass="modeMenu">
    <asp:ListItem>Mode1</asp:ListItem>
    <asp:ListItem>Mode2</asp:ListItem>
</asp:DropDownList>
Protected Sub mode(ByVal sender As Object, ByVal e As System.EventArgs) Handles modeMenu.Load, modeMenu.SelectedIndexChanged
    Session.Add("mode", modeMenu.SelectedValue)  //Added this
    Select Case (modeMenu.SelectedValue)
        Case "Mode1"
            mode1Nav.Visible = True
            mode2Nav.Visible = False
        Case "Mode2"
            mode1Nav.Visible = False
            mode2Nav.Visible = True
    End Select
End Sub
.modeMenu {
    position: fixed;
    top: 5px;
    left: 5px;
}