在回发后恢复下拉所选项目

时间:2013-07-04 07:10:27

标签: asp.net postback viewstate autopostback selectedindexchanged

想法

我正在尝试做一件非常简单的事情 - 当选择下拉列表的项目时刷新页面。下拉列表的选定项目作为参数传递给查询字符串。页面重新加载。然后从查询字符串中获取参数,并用于恢复下拉列表的选择。参数保留所选项的值。

问题

实际选择的值不会传递给查询字符串参数,它始终为“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"])));
    }
}

在这种情况下,选定的值永远不会保存到查询字符串,并且永远不会恢复所选项目。

一大问题

我会错过什么以及如何使其保留所选值并在回发后恢复?

问题部分解决

查看我的回答

2 个答案:

答案 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"])));
    }
}