无法取消选中复选框。 ASP.NET

时间:2016-08-03 01:01:59

标签: c# asp.net

问题很可能是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”

有没有人能解决这个问题?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您在TestPage1上选中了复选框(/TestPage1.aspx?B1=1),当您手动取消选中该复选框并单击B​​utton1时,您将返回/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)

它是这样的:

  1. 您已在浏览器中加载/TestPage1.aspx?B1=1
  2. 您在浏览器中取消选中CheckBox1,然后点击Button1
  3. Page_Load()在服务器上运行完整的/TestPage1.aspx?B1=1地址。它会看到B1查询字符串,因此CheckBox1再次设置为已检查。
  4. Button1_Click()在服务器上运行。它现在检查了CheckBox1,因此QString再次包含B1。服务器现在重定向到/TestPage1.aspx?B1=1(仍然包含完整的查询字符串。
  5. Page_Load()再次运行,CheckBox1再次设置为已选中。
  6. 该页面最终被发送回浏览器,您现在可以在其中查看Checkbox1
  7. 如果您在浏览器中只有TestPage1.aspx(没有?B1=1),则 可以取消选中该复选框。但只要那个?B1=1存在,事件的循环就会再次发回。

    这里最常见的错误是不要指望第3步。请记住,任何服务器事件(甚至是简单的按钮点击)都是full page lifecycle的一部分。 您可以在设置复选框之前更改Page_Load()以包含!IsPostBack()测试来提供帮助。