不能取消选中复选框.ASP.NET
本文关键字:ASP NET 复选框 取消 不能 | 更新日期: 2023-09-27 17:59:45
问题很可能是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),我会得到选中复选框的页面。如果我取消选中并按按钮1,我将被重定向到页面"TestPage1.aspx?B1=1"
有人能解决这个问题吗?
如果我理解正确,您在TestPage1上选中了复选框(/TestPage1.aspx?B1=1
),当您手动取消选中复选框并单击按钮1时,您将返回到/TestPage1.aspx?B1=1
,现在将重新检查复选框。
之所以会发生这种情况,是因为Page_Load
事件是在控制事件(例如Button1的OnClick
事件)之前引发的。以下是MSDN文档,详细介绍了页面生命周期事件。
由于您的页面正在返回到/TestPage1.aspx?B1=1
,Page_Load
处理程序会在Button1_Click
有机会删除查询字符串之前看到该字符串。当Button1_Click
处理程序运行时,该复选框已经被重新检查,处理程序会重定向回相同的url,其中包括查询字符串。
对于您的示例,一个简单的解决方案是在Page_Load
事件中检查IsPostBack
属性,并且只有在页面没有返回时才选中该复选框。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack && Request.QueryString["B1"] != null)
{
CheckBox1.Checked = true;
}
}
它是这样的:
- 您的浏览器中已加载
/TestPage1.aspx?B1=1
- 在浏览器中取消选中
CheckBox1
,然后单击Button1
- 对于完整的
/TestPage1.aspx?B1=1
地址,Page_Load()
在服务器上运行。它看到B1
查询字符串,因此CheckBox1
被再次设置为选中 Button1_Click()
在服务器上运行。它看到CheckBox1
现在被检查,所以QString
再次包括B1
。服务器现在重定向到/TestPage1.aspx?B1=1
(仍然包括完整的查询字符串Page_Load()
再次运行,并且CheckBox1
再次被设置为被检查- 页面最终被发送回浏览器,您可以在浏览器中观察到
Checkbox1
现在已被选中
如果浏览器中只有TestPage1.aspx
(没有?B1=1
),则可以不选中该复选框。但只要?B1=1
在那里,事件的循环总是会让它再次出现。
这里最常见的错误是不期望步骤3。请记住,任何服务器事件(甚至是简单的按钮单击)都是作为整个页面生命周期的一部分运行的。您可以通过在设置复选框之前将Page_Load()
更改为包含!IsPostBack()
测试来帮助实现这一点。