问题很可能是QueryString。当我从结果页面返回搜索页面时,一切都崩溃了。我使用QueryString检查生成结果页面之前检查的所有框。这次我可以取消选中复选框,但只能在视觉上。生成结果页面就好像它们仍然被检查一样。
这是一个简单的例子。我添加了复选框和一个按钮......
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["B1"] != null)
{
CheckBox1.Checked = true;
}
}
protected void Button1_Click(object sender, EventArgs e)
{
string QString = null;
if (CheckBox1.Checked)
{
QString += "?B1=1";
}
Response.Redirect("/TestPage1.aspx" + QString);
}
如果我转到Default.aspx并且如果我添加“?B1 = 1”(Default.aspx?B1 = 1),我将获得选中复选框的页面。如果我取消选中它并按下Button1,我将被重定向到页面“TestPage1.aspx?B1 = 1”
有没有人能解决这个问题?
答案 0 :(得分:1)
如果我理解正确,您在TestPage1上选中了复选框(/TestPage1.aspx?B1=1
),当您手动取消选中该复选框并单击Button1时,您将返回/TestPage1.aspx?B1=1
,现在将重新检查该复选框。
发生这种情况是因为{1}}事件在控制事件(例如Button1的Page_Load
事件)之前引发。 Here is the MSDN documentation详细说明了页面生命周期事件。
由于您的网页回发到OnClick
,/TestPage1.aspx?B1=1
处理程序会在Page_Load
有机会删除之前看到查询字符串。当Button1_Click
处理程序运行时,复选框已经被重新检查,处理程序重定向回相同的URL,包括查询字符串。
您的示例的一个简单解决方案是检查Button1_Click
事件中的IsPostBack
属性,并仅在页面未回发时选中该复选框。
Page_Load
答案 1 :(得分:0)
它是这样的:
/TestPage1.aspx?B1=1
。CheckBox1
,然后点击Button1
Page_Load()
在服务器上运行完整的/TestPage1.aspx?B1=1
地址。它会看到B1
查询字符串,因此CheckBox1
再次设置为已检查。Button1_Click()
在服务器上运行。它现在检查了CheckBox1
,因此QString
再次包含B1
。服务器现在重定向到/TestPage1.aspx?B1=1
(仍然包含完整的查询字符串。Page_Load()
再次运行,CheckBox1
再次设置为已选中。Checkbox1
。如果您在浏览器中只有TestPage1.aspx
(没有?B1=1
),则 可以取消选中该复选框。但只要那个?B1=1
存在,事件的循环就会再次发回。
这里最常见的错误是不要指望第3步。请记住,任何服务器事件(甚至是简单的按钮点击)都是full page lifecycle的一部分。
您可以在设置复选框之前更改Page_Load()
以包含!IsPostBack()
测试来提供帮助。