Asp.net UpdatePanel中的DropDownList

Asp.net UpdatePanel中的DropDownList,asp.net,ajax,updatepanel,Asp.net,Ajax,Updatepanel,在我的项目中,我在updatepanel中放置了一个dropdownlist。我想做的是从dropdownlist中选择一个值并在会话中使用它 但无论我做什么,它总是会给我空值,因为没有选中“启用自动回发”。当我这样做时,它会刷新页面,所以这不是我想要的。为了获得存储到会话的任何内容,您必须将其提交到服务器 关于为什么不希望UpdatePanel刷新的更多细节,以及在会话中使用该值试图实现什么,可能会有所帮助 编辑:根据您的评论,我认为解决方案是在会话中存储当前的.ascx文件,并将DropDo

在我的项目中,我在updatepanel中放置了一个dropdownlist。我想做的是从dropdownlist中选择一个值并在会话中使用它


但无论我做什么,它总是会给我空值,因为没有选中“启用自动回发”。当我这样做时,它会刷新页面,所以这不是我想要的。为了获得存储到会话的任何内容,您必须将其提交到服务器

关于为什么不希望UpdatePanel刷新的更多细节,以及在会话中使用该值试图实现什么,可能会有所帮助

编辑:根据您的评论,我认为解决方案是在会话中存储当前的.ascx文件,并将DropDownList设置为启用自动回发

因此,在处理“下一步”和“上一步”按钮时,为正确的.ascx-to会话存储一个指示器


在对dropdownlist事件进行回发处理期间,您可以通过检查会话中要显示的正确文件来确保当前.ascx文件仍在显示。当结果返回到客户端时,似乎没有任何变化,因为UpdatePanel足够聪明,可以意识到它是相同的内容,并且您将成功地处理dropdownlist值。

听起来您在这里做的工作比您需要做的要多。您是否研究过使用ASP.NET向导控件?或者只是谷歌一下


如果您仍想按自己的方式进行,则必须提交到服务器(无自动回邮+手动提交按钮单击,或启用自动回邮),因为会话是服务器端概念。HTTP是一种无状态协议,因此状态的唯一概念必须在HTTP的域之外完成。这意味着您无法将状态存储在服务器上(例如,在会话中),或者更严格地说,存储在客户端计算机上(例如在cookie中)。

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

非常感谢,我通过在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

谢谢你的所有回答

我已经创建了一个类似向导的结构。实际上它非常复杂。但让我告诉你。我有7.ascx文件,在我的默认.aspx文件中有ScriptManager和UpdatePanel。在我的UpdatePanel中,通过使用“下一步”和“上一步”按钮,我动态调用这些.ascx文件,以便提供类似向导的视图。如果我autopostback我的dropdownlist它将返回到第一个名为page1.ascx的webusercontrol。这对我来说是不可接受的。我试图找到一个解决方案,但找不到是,通过使用会话,我计划存储全局变量以用于其他.ascx文件。OK现在我找到了一种解决方法。正如我所说,我在updatepanel中动态调用了7个ascx文件。如果我使用if(IsPostBack),那么。。。。如果我可以让它工作,我通常会在我的页面加载和页面初始化函数周围添加If(IsPostback)检查,如果它们有任何内容。。。