首页 文章

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

提问于
浏览
3

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 回答

  • 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 page属性为 True . 没有页面重定向 . 不使用查询字符串 . 而是使用 Session 变量 . 这是在回发期间保持值的好方法 .

  • 1

    当您从下拉列表中选择一个项目时,您将在 RefreshPage() 方法之前点击 Page_Load()

    这意味着您将在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"])));
        }
    }
    

相关问题