Response.Redirect到同一页面与查询字符串导致asp.net中的回发问题

时间:2012-04-28 05:08:50

标签: asp.net web postback

今天我已经花了很多时间试图解决这个问题而且我在自己身边,所以任何见解都会非常感激。我有一个Web用户控件(我们使用它们而不是整个应用程序中的典型Web表单),它有4个控件。 RadioButtonList,按钮,checkboxlist和DataGrid。这样的控制并不重要,但我只是在这里提到它们的背景。网格是典型的网格,它将根据通过上述控件进行的选择显示结果。

所有工作都按预期工作,直到我必须进行更改,我必须使用Response.Redirect到查询字符串的同一页面,以便网格将根据传入的查询字符串显示结果。我注意到了什么就是在这个重定向的页面上,在回发时,我无法获得控件的值。因此,例如,当我在RadioButtonList中选择一个值(autopostback设置为true)时,会触发PageLoad,但是在触发该值时,该值在Page_Load中不可用 - 而是显示之前的值。每次,我在RadioBUttonList中选择一个不同的值,Page_Load不显示当前值(导致PostBack的值),而是前一个值。

我做错了什么?这甚至可能..我已经调试了一天,并发现每个标志工作正常,除了这个问题。原始页面(完成重定向的页面)不显示任何内容。请帮我理解发生了什么......

按要求添加代码示例。

public partial class ParentPage :     
{
   protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            labelMessage.Text = "";
            if (Page.IsPostBack == false)
            {
                //Initialize Page
                InitializePage();

                //Read query string and initialize page
                Hashtable queryparms = HttpQueryString.Decrypt(Request.Url.ToString());
                if (queryparms["OptionsChartType"] != null)
                {
                    string[] strChartType = queryparms["OptionsChartType"].ToString().Split(',');
                    foreach ( string s in strChartType)
                    {
                        chkboxChartType.Items.FindByValue(s).Selected = true;
                    }
                }

                if (queryparms["OptionsRblBiasOptions"] != null) 
                    rblBiasOptions.SelectedValue = queryparms["OptionsRblBiasOptions"].ToString();
                if (queryparms["OptionsChartStyle"] != null)
                    rblChartStyle.SelectedValue = queryparms["OptionsChartStyle"].ToString();

                if (queryparms["OptionsDisplay"] != null) 
                {
                    string[] strDisplayOptions = queryparms["OptionsDisplay"].ToString().Split(',');
                    foreach ( string s in strDisplayOptions )
                    {
                        chkboxDisplay.Items.FindByValue(s).Selected = true;
                    }
                }

                if( queryparms.Count > 1)
                    BindGrid();
            }
            else
            {
                //Require this for sorting to work
                string abc = rblChartStyle.SelectedValue;
                BindGrid();
            }
        }
}

//Method that calls the Response.redirect
private void DisplayDetails()
    {
        StringBuilder sb = new StringBuilder("~/MyContainer.aspx?ctrlPath=ParentPage.ascx");
        sb.Append("&OptionsChartType=" + CollectionToString(chkboxChartType.Items));
        sb.Append("&OptionsRblBiasOptions=Subject");
        sb.Append("&OptionsChartStyle=" + rblChartStyle.SelectedValue);
        sb.Append("&OptionsDisplay=" + CollectionToString(chkboxDisplay.Items));
        SaveUrl();
        Response.Redirect(HttpQueryString.Encrypt(sb.ToString()),false);
        this.Context.ApplicationInstance.CompleteRequest();
    }

您将在上面的代码中看到DisplayDetails方法使用查询字符串重定向到ParentPage本身。重定向工作正常,但是一旦我们到达重定向页面,RadioButtonList等导致回发的任何后续活动都没有反映在Page_Load中。因此,如果我将RadioButtonList的选定值从“A”更改为“B”,则PageLoad方法中的字符串“abc”仍具有值“A”。如果我将“B”改回“A”,则字符串“abc”现在具有“A”,这是前一个值。

2 个答案:

答案 0 :(得分:0)

如果必须根据UI控件值更改GridView上的结果

  • 您应该使用UI上的事件更改GridView的“DataSource”属性
  • 检查控件的“EnableViewState”

如果没有,请解释您何时想要刷新GridView

谢谢

答案 1 :(得分:0)

我对此没有回应。我已经修改了我的代码以使用ViewState,而不是重定向到同一页面,一切都按需要工作。仍然希望学到新的东西。感谢所有观看此主题的人。