私は今日の大部分をこれを理解しようと費やしましたが、私は自分のそばにいるので、どんな洞察も大歓迎です. 4 つのコントロールを持つ Web ユーザー コントロール (アプリ全体で一般的な Web フォームの代わりに使用します) があります。RadioButtonList、ボタン、チェックボックス リスト、および 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」が含まれます。