【问题标题】:DropDownList not maintaining ViewState for "User Mode Menu" SelectorDropDownList 不维护“用户模式菜单”选择器的 ViewState
【发布时间】:2011-07-19 19:56:40
【问题描述】:

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

我在 Page_Load 中添加了以下内容:

If Not IsPostBack Then
    modeMenu.SelectedValue = Session("mode")
End If

编辑:其余部分相同,只是后面的代码中多了一行。感谢 TC 的回答:)

<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>

这个“modeMenu”用来选择我的模式。

<asp:DropDownList ID="modeMenu" runat="server" AutoPostBack="True" 
    ViewStateMode="Enabled" CssClass="modeMenu">
    <asp:ListItem>Mode1</asp:ListItem>
    <asp:ListItem>Mode2</asp:ListItem>
</asp:DropDownList>

Sub 后面的这段代码旨在为您所处的任何模式显示适当的菜单,记住它,哈哈。

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

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

编辑:此外,我添加了以下 CSS 以使我的模式菜单不碍事。它像这样很好地工作。真的很方便开发。 :)

.modeMenu {
    position: fixed;
    top: 5px;
    left: 5px;
}

【问题讨论】:

    标签: asp.net menu drop-down-menu postback viewstate


    【解决方案1】:

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

    【讨论】:

    • @TC:我在让它工作时遇到了问题,但我会再研究一下,然后再试一次。
    • @TC:哎呀,难怪。我一直在尝试使用 SessionState(命名空间)而不是 Session(对象)doh!非常感谢你让我重新审视我的错误。干杯:)
    【解决方案2】:

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

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

    如果你熟悉 Jquery,你也可以使用 jquery cookie 插件,这样你的页面在创建 cookie 时不必回传。

    【讨论】:

    • 不,我更喜欢服务端维护的模式。
    • 您确实意识到,如果您将其存储在会话状态中,则它仅在用户访问期间有效。 Cookie 确实记得他们回来时的模式。如果你想将它存储在服务器端,你也可以将它存储在数据库中。但这一切都取决于你更了解的需求!
    【解决方案3】:

    我猜您正在尝试创建级联 DDL?如果是这样,您需要覆盖 LoadViewState 和 SaveViewState 并在那里操作您的 ViewState :)

    【讨论】:

    • 嗯...可能不是?这可能是另一种方式,但不知道。如果其他人不工作,我稍后会尝试你的想法:)
    • 不管怎样,在使用DDLs、Radio Button Lists等的时候还是需要重写这两个方法
    • @IrishChieftan:我会牢记这一点。谢谢芽:)
    • 没有问题,这些特定控件在保留 ViewState 时似乎有问题(可能是生命周期问题),并且没有记录我可以看到 :)
    【解决方案4】:

    Visible 属性未存储在 ViewState 中。为了让它被记住,您应该在您的 Page_Load() 事件处理程序中添加一些内容。

    【讨论】:

      猜你喜欢
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      相关资源
      最近更新 更多