THE IDEA
我正在尝试做一个非常简单的事情 - 当选择下拉列表的项目时刷新页面 . 下拉列表的选定项目作为参数传递给查询字符串 . 页面重新加载 . 然后从查询字符串中获取参数,并用于恢复下拉列表的选择 . 参数保留所选项的值 .
THE PROBLEM
实际选择的值不会传递给查询字符串参数,它始终为“0” . DropDownList永远不会获取最后选择的项目,它总是恢复在ViewState中保存的项目 . ViewState不想记住新东西,它始终保持同一个信息 . 几个月来我一直试图找到解决方案 . 在某些页面上它可以工作,但在大多数情况下它没有 . 如果它在我的网络应用程序的某个地方工作,我完全不知道为什么,并希望它会在第二天继续工作 . 有时它只是停止工作,我无法解决它 .
DEFAULT ASPX PAGE
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="ExperimentalPage.aspx.cs"
Inherits="ExperimentalPage" Title="Enperimental Page" EnableViewState="True" %>
<asp:Content ID="ExperimentalLeftPane" ContentPlaceHolderID="cph_LeftPane" Runat="Server">
<div style="position: absolute; left: 0px; top: 35px; width: 250px;">
<asp:DropDownList ID="dd1" runat="server" OnSelectedIndexChanged="RefreshPage" AutoPostBack="True" CssClass="class_DropDown" Style="width: 250px; margin-bottom: 3px;"/>
</div>
</asp:Content>
DEFAULT ASPX.CS CODE-BEHIND PAGE
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
dd1.Items.Insert(0, "dd1-0");
dd1.Items[0].Value = "0";
dd1.Items.Insert(1, "dd1-1");
dd1.Items[1].Value = "1";
dd1.Items.Insert(2, "dd1-2");
dd1.Items[2].Value = "2";
}
else
{
dd1.SelectedIndex = dd1.Items.IndexOf(dd1.Items.FindByValue(Convert.ToString(Request.QueryString["dd1"])));
}
}
protected void RefreshPage(object o, EventArgs e)
{
Page.Response.Redirect("ExperimentalPage.aspx?"
+ "&dd1=" + dd1.SelectedValue);
}
ATTEMPTS TO MAKE IT WORK
Scenario 1. EnableViewState="True"
我选择下拉列表的第三项(值为“2”),页面重新加载 . 查询字符串永远不会取值“2” . 它总是“0” . 第一项始终在回发后选择,可能是因为ViewState重置了它 .
Scenario 2. EnableViewState="False"
未保存选定的值 . 回发后DropDownList完全为空 .
Scenario 3. EnableViewState="False". Dropdownlist is filled with data on each page load. Postback is checked only for retrieving selected value:
protected void Page_Load(object sender, EventArgs e)
{
//if (!Page.IsPostBack)
//{
dd1.Items.Insert(0, "dd1-0");
dd1.Items[0].Value = "0";
dd1.Items.Insert(1, "dd1-1");
dd1.Items[1].Value = "1";
dd1.Items.Insert(2, "dd1-2");
dd1.Items[2].Value = "2";
//}
//else
if (Page.IsPostBack)
{
dd1.SelectedIndex = dd1.Items.IndexOf(dd1.Items.FindByValue(Convert.ToString(Request.QueryString["dd1"])));
}
}
在这种情况下,选定的值永远不会保存到查询字符串,并且永远不会恢复下拉列表 .
ONE BIG QUESTION
我想念什么以及如何使它保持所选值并在回发后恢复它?
THE PROBLEM PARTIALLY RESOLVED
看到我的回答
2 回答
好的,我已经意识到如何解决它 . 如果有人需要它,这就是解决方案 .
在此解决方案中, EnableViewState page属性为 True . 没有页面重定向 . 不使用查询字符串 . 而是使用 Session 变量 . 这是在回发期间保持值的好方法 .
当您从下拉列表中选择一个项目时,您将在
RefreshPage()
方法之前点击Page_Load()
这意味着您将在RefreshPage方法之前执行此行:
Convert.ToString(Request.QueryString [“dd1”]))将计算为null,因此SelectedIndex将设置为0 .
如果您想要完成这项工作,您应该尝试以下方法: