我有一个问题。
在我的项目中,我在更新面板中放置了一个下拉列表。我想要做的是从下拉列表中选择一个值并在会话中使用它。
但无论我做什么,它总是会给我空值,因为没有选中“启用AutoPostBack”。当我这样做时,它会刷新页面,所以这不是我想要的。
我该如何解决这个问题?
任何想法......
答案 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
谢谢你的所有答案