DropDownList не поддерживает ViewState для селектора "User Mode Menu" - PullRequest
0 голосов
/ 19 июля 2011

Я буду держать это простым. В целях разработки я хочу создать «режимы», представляющие различные типы пользователей, которые будут соответственно видеть другую строку меню. У меня есть все, как я хочу, кроме выбора «режима», в котором я хочу работать, как только я нажимаю на элемент меню, он забывает, в каком «режиме» он находился, и обновляется с помощью панели меню по умолчанию. , Я предполагаю, что это проблема с ViewState, который не поддерживается должным образом по обратной передаче? Я искал по всем форумам и в других местах и ​​не могу понять, как добиться того, что я хочу. Вот мой код с codebehind.

Я добавил следующее к Page_Load:

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

РЕДАКТИРОВАТЬ : остальное то же самое, за исключением одной дополнительной строки в коде позади. Спасибо ТС за ответ:)

<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 предназначен для отображения соответствующего меню для любого режима, в котором вы находитесь, И ПОМНИТЕ, lol.

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

Ответы [ 4 ]

0 голосов
/ 20 июля 2011

Полагаю, вы пытаетесь создать каскадные DDL? Если это так, вам нужно переопределить LoadViewState и SaveViewState и управлять там вашим ViewState:)

0 голосов
/ 20 июля 2011

Если я правильно понимаю (я никогда не использовал элемент управления меню), проблема в том, что при щелчке по вашему пункту меню вы переходите на новый URL. ViewState сохраняется только между PostBacks, а не между «новыми» посещениями новых URL. Попробуйте вместо этого использовать Session State .

0 голосов
/ 20 июля 2011

Можете ли вы использовать куки для хранения вашего режима?

Когда пользователь выбирает режим, сохраните значение в файле cookie.Когда какая-либо страница загружается впоследствии, проверьте наличие cookie в событии загрузки страницы и установите соответствующий режим.

Если вы знакомы с Jquery, вы также можете использовать плагин cookie jquery, так что вашей странице не нужноотправлять обратно при создании файла cookie.

0 голосов
/ 20 июля 2011

Свойство Visible не сохраняется в ViewState. Для того, чтобы это запомнилось, вы должны поместить что-то в ваш Page_Load() обработчик событий.

...