Выпадающий список в UpdatePanel


У меня проблема.

В моем проекте я поместил выпадающий список в updatepanel.что я хотел сделать, так это выбрать значение из выпадающего списка и использовать его в сеансе.

Но что бы я ни делал,он всегда будет давать мне нулевое значение из-за отсутствия проверки "включить AutoPostBack".и когда я сделаю это, он обновит страницу, так что это не то, что я хотел.

Как я могу решить эту проблему?

Любые идеи...

4 8

4 ответа:

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

КОД ASPX

<form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <div>
        Current Time: <asp:Label ID="lblTime" runat="server" /><br />
        Session Value: <asp:Label ID="lblSessionValue" runat="server" /><br />
        <br />
        <asp:UpdatePanel ID="upSetSession" runat="server">
            <ContentTemplate>
                <asp:DropDownList ID="ddlMyList" runat="server" 
                    onselectedindexchanged="ddlMyList_SelectedIndexChanged"
                    AutoPostBack="true">
                    <asp:ListItem>Select One</asp:ListItem>
                    <asp:ListItem>Maybe</asp:ListItem>
                    <asp:ListItem>Yes</asp:ListItem>
                </asp:DropDownList>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="ddlMyList" 
                    EventName="SelectedIndexChanged" />
            </Triggers>
        </asp:UpdatePanel>
    </div>
</form>

КОД ЗА

    protected void Page_Load(object sender, EventArgs e)
    {
        this.lblTime.Text = DateTime.Now.ToShortTimeString();
        if (Session["MyValue"] != null) 
            this.lblSessionValue.Text = Session["MyValue"].ToString();
    }

    protected void ddlMyList_SelectedIndexChanged(object sender, EventArgs e)
    {
        Session.Remove("MyValue");
        Session.Add("MyValue", this.ddlMyList.SelectedValue);
    }

Чтобы получить что-либо сохраненное в сеансе, вы должны отправить его на сервер.

Возможно, вам будет полезно узнать, почему вы не хотите обновлять панель UpdatePanel, и что вы пытаетесь сделать, используя значение в сеансе.

EDIT: основываясь на ваших комментариях, мне кажется, что решением было бы сохранить текущий .ascx-файл в сеансе, и установите свой выпадающий список, чтобы иметь autopostback включен.

Итак, о вашем обращении с "следующим" и кнопки "Назад", хранят индикатор для правильного .ascx к сессии.

Во время обратной обработки события dropdownlist вы можете просто убедиться, что текущий .файл ascx все еще отображается, проверяя сеанс для правильного файла, чтобы показать. Когда результат будет возвращен клиенту, ничего не изменится, потому что UpdatePanel достаточно умна, чтобы понять, что это то же самое содержимое, и вы успешно справитесь со значением dropdownlist.

Похоже, что вы делаете гораздо больше работы, чем вам нужно. Вы рассматривали возможность использования ASP.NET контроль над волшебником? http://msdn.microsoft.com/en-us/magazine/cc163894.aspx или просто погуглите его.

Если вы все еще хотите сделать это по-своему, вы должны Отправить на сервер (либо без autopostback + ручной щелчок кнопки submit, либо включив autopostback), так как сеанс-это концепция на стороне сервера. HTTP-это протокол без состояния, поэтому единственная концепция состояния должна быть сделано за пределами домена HTTP. Это означает, что вы застряли с сохранением состояния на сервере (например, в сеансе) или, что гораздо более ограничительно, на компьютере клиента (например, в файле cookie).

Спасибо большое, я решил проблему, управляя переменными в событии Page_Load.

If Label1.Text = 1 Then
    Dim tempcontrol2 As Control = LoadControl("Page1.ascx")
    PlaceHolder1.Controls.Add(tempcontrol2)

ElseIf Label1.Text = 2 Then
    Dim tempcontrol2 As Control = LoadControl("Page2.ascx")
    PlaceHolder1.Controls.Add(tempcontrol2)
End If

Спасибо Вам за все ответы