我想这个问题是一个很难的问题。我有两个功能相同的页面。第一个是针对人的。第二个是作为副本创建的,然后针对产品进行了一些修改。
我在两个页面上都有DropDownLists ,两个 DDL 都启用了OnSelectedIndexChanged事件和AutoPostBack 选项。两个页面都有代码隐藏过程RefreshPage ,它使用id参数重新加载页面。此id参数是下拉列表中实际选择的值。
所以,按照设计:
1) 我更改了 DDL 的选定项目,它执行 AutoPostBack 并触发 OnSelectedIndexChanged 事件。
2) 此事件运行RefreshPage过程,该过程将 DDL 的当前选定值添加到 QueryString 并用它重新加载页面。
3)然后这个ID取自QueryString并设置为DDL。查看代码。
RefreshPage在People.aspx页面上成功运行。但是Products.aspx上的类似程序根本不会运行。我将断点添加到两个过程的同一位置 - Page.Response.Redirect方法的行。在第一页它停止并显示参数paramID的正确值,但第二页永远不会到达断点。OnSelectedIndexChanged事件被简单地跳过。
两个页面都有EnableViewState disabled。我不使用 javascript 或 AJAX。我不使用PreRender方法。
这是我的代码。
人.aspx:
<asp:DropDownList ID="ddJGroup" runat="server" OnSelectedIndexChanged="RefreshPage" AutoPostBack="True" CssClass="DropDown" Font-Bold="True"/>
人.aspx.cs:
protected void RefreshPage(object s, EventArgs e)
{
paramID = ddJGroup.SelectedValue;
Page.Response.Redirect("People.aspx?id=" + paramID);
}
产品.aspx:
<asp:DropDownList ID="ddCType" runat="server" OnSelectedIndexChanged="RefreshPage" AutoPostBack="True" CssClass="class_DropDown" Font-Bold="True"/>
在这两个页面中,我从 QueryString 中获取id参数,并在 Page_Load 过程中使用它设置 DropDownLists 的选定值。见下文。
产品.aspx.cs:
...
if ((Request.QueryString["id"] != null) && (Request.QueryString["id"] != ""))
paramID = Convert.ToInt32(Request.QueryString["id"]);
...
ddCType.DataSource = sqlReader;
ddCType.DataValueField = "c_type_id";
ddCType.DataTextField = "type_name";
ddCType.DataBind();
ddCType.SelectedIndex = ddCType.Items.IndexOf(ddCType.Items.FindByValue(Convert.ToString(paramID)));
这段代码工作正常。但是在Products.aspx上,参数paramID永远不会改变。它应该在RefreshPage过程中发生变化,但该过程永远不会运行并且永远不会更改QueryString["id"]参数。我的意思是,这个页面永远不会从RefreshPage重新加载,它总是做简单的 PostBack。
在 RefreshPage 过程中:
protected void RefreshPage(object o, EventArgs e)
{
paramID = ddCType.SelectedValue;
Page.Response.Redirect("Products.aspx?id=" + paramID);
}
如果此过程运行,页面将使用新的id参数重新加载,并且下拉列表将获取此新索引。