UpdatePanel中的DropDownList

时间:2009-08-10 20:10:46

标签: asp.net ajax updatepanel

我有一个问题。

在我的项目中,我在更新面板中放置了一个下拉列表。我想要做的是从下拉列表中选择一个值并在会话中使用它。

但无论我做什么,它总是会给我空值,因为没有选中“启用AutoPostBack”。当我这样做时,它会刷新页面,所以这不是我想要的。

我该如何解决这个问题?

任何想法......

4 个答案:

答案 0 :(得分:23)

听起来您可能没有正确使用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);
    }

答案 1 :(得分:3)

为了将任何内容存储到Session,您必须将其提交给服务器。

也许有关您不希望UpdatePanel刷新的原因的更多细节会有所帮助,以及您尝试使用Session中的值来完成的任务。

编辑:根据您的评论,在我看来,解决方案是将当前.ascx文件存储在Session中,并将DropDownList设置为启用自动后备。

因此,在处理“下一步”和“后退”按钮时,请将正确的.ascx指示符存储到会话。

在回滚列表事件的回发处理期间,您可以通过检查会话以查看要显示的正确文件,确保仍然显示当前的.ascx文件。当结果返回给客户端时,没有任何内容会显示已更改,因为UpdatePanel足够智能,可以实现相同的内容,并且您将成功处理下拉列表值。

答案 2 :(得分:1)

听起来你做的工作比你需要的更多。您是否考虑过使用ASP.NET向导控件? http://msdn.microsoft.com/en-us/magazine/cc163894.aspx或只是谷歌。

如果您仍然希望按照自己的方式进行操作,则 要提交给服务器(没有autopostback +手动提交按钮单击,或启用自动后备),因为Session是服务器 - 侧面的概念。 HTTP是无状态协议,因此唯一的状态概念必须在HTTP域之外完成。这意味着你在服务器上存储状态(例如,在会话中),或者更严格地说,在客户端的计算机上(例如在cookie中)。

答案 3 :(得分:1)

非常感谢我通过控制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

谢谢你的所有答案