不能取消选中复选框.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"

有人能解决这个问题吗?

不能取消选中复选框.ASP.NET

如果我理解正确,您在TestPage1上选中了复选框(/TestPage1.aspx?B1=1),当您手动取消选中复选框并单击按钮1时,您将返回到/TestPage1.aspx?B1=1,现在将重新检查复选框。

之所以会发生这种情况,是因为Page_Load事件是在控制事件(例如Button1的OnClick事件)之前引发的。以下是MSDN文档,详细介绍了页面生命周期事件。

由于您的页面正在返回到/TestPage1.aspx?B1=1Page_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;
    }
}

它是这样的:

  1. 您的浏览器中已加载/TestPage1.aspx?B1=1
  2. 在浏览器中取消选中CheckBox1,然后单击Button1
  3. 对于完整的/TestPage1.aspx?B1=1地址,Page_Load()在服务器上运行。它看到B1查询字符串,因此CheckBox1被再次设置为选中
  4. Button1_Click()在服务器上运行。它看到CheckBox1现在被检查,所以QString再次包括B1。服务器现在重定向到/TestPage1.aspx?B1=1(仍然包括完整的查询字符串
  5. Page_Load()再次运行,并且CheckBox1再次被设置为被检查
  6. 页面最终被发送回浏览器,您可以在浏览器中观察到Checkbox1现在已被选中

如果浏览器中只有TestPage1.aspx(没有?B1=1),则可以不选中该复选框。但只要?B1=1在那里,事件的循环总是会让它再次出现。

这里最常见的错误是不期望步骤3。请记住,任何服务器事件(甚至是简单的按钮单击)都是作为整个页面生命周期的一部分运行的。您可以通过在设置复选框之前将Page_Load()更改为包含!IsPostBack()测试来帮助实现这一点。