想法
我正在尝试做一件非常简单的事情 - 当选择下拉列表的项目时刷新页面。下拉列表的选定项目作为参数传递给查询字符串。页面重新加载。然后从查询字符串中获取参数,并用于恢复下拉列表的选择。参数保留所选项的值。
问题
实际选择的值不会传递给查询字符串参数,它始终为“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);
}
努力使其发挥作用
场景1. EnableViewState =“True”
我选择下拉列表的第三项(值为“2”),页面重新加载。查询字符串永远不会取值“2”。它总是“0”。第一项始终在回发后选择,可能是因为ViewState重置了它。
场景2. EnableViewState =“False”
未保存所选值。回发后,DropDownList完全为空。
场景3. EnableViewState =“False”。下拉列表中填充了每个页面加载的数据。仅检查回发以检索所选值:
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"])));
}
}
在这种情况下,选定的值永远不会保存到查询字符串,并且永远不会恢复所选项目。
一大问题
我会错过什么以及如何使其保留所选值并在回发后恢复?
问题部分解决
查看我的回答
答案 0 :(得分:2)
好的,我已经意识到如何解决它。如果有人需要它,这就是解决方案。
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";
}
}
protected void RefreshPage(object o, EventArgs e)
{
Session["dd1"] = dd1.SelectedValue;
dd1.SelectedIndex = dd1.Items.IndexOf(dd1.Items.FindByValue(Convert.ToString(Session["dd1"])));
}
在此解决方案中, EnableViewState 页面属性为 True 。 没有页面重定向。不使用查询字符串。而是使用会话变量。这是在回发期间保持值的好方法。
答案 1 :(得分:1)
当您从下拉列表中选择一个项目时,您会在Page_Load()
方法之前点击RefreshPage()
这意味着您将在RefreshPage方法之前执行此行:
dd1.SelectedIndex = dd1.Items.IndexOf(dd1.Items.FindByValue(Convert.ToString(Request.QueryString["dd1"])));
Convert.ToString(Request.QueryString [“dd1”]))将评估为null,因此SelectedIndex将设置为0.
如果你想做这项工作,你应该尝试以下方法:
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";
if (!string.IsNullOrEmpty(Request.QueryString["dd1"]))
{
dd1.SelectedIndex = dd1.Items.IndexOf(dd1.Items.FindByValue(Convert.ToString(Request.QueryString["dd1"])));
}
}