DropDownList в UpdatePanel - PullRequest
       17

DropDownList в UpdatePanel

9 голосов
/ 11 августа 2009

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

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

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

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

любые идеи ...

Ответы [ 4 ]

23 голосов
/ 11 августа 2009

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

ASPX CODE

<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);
    }
3 голосов
/ 11 августа 2009

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

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

РЕДАКТИРОВАТЬ: Исходя из ваших комментариев, мне кажется, что решение было бы сохранить текущий файл .ascx в сеансе и установить свой DropDownList, чтобы включить автоответчик.

Таким образом, при обработке кнопок «Далее» и «Назад» сохраните индикатор правильного .ascx для сеанса.

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

1 голос
/ 11 августа 2009

спасибо большое, я решил проблему, управляя переменными в событии 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

спасибо за все ответы

1 голос
/ 11 августа 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...