Значение ASP.Net Checkbox при обратной передаче неверно? - PullRequest
22 голосов
/ 06 октября 2009

У нас есть флажок, который изначально отключен и проверен. Затем он включается на стороне клиента через JavaScript. Если пользователь затем снимает флажок и нажимает кнопку, чтобы вызвать обратную передачу, состояние флажка остается таким же, как проверено на стороне сервера. Это явно нежелательное поведение. Вот пример.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="testcb.aspx.cs" Inherits="ESC.testcb" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">

    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <script type="text/javascript">
        function buttonClick() {
            var cb = document.getElementById('<%= CheckBox1.ClientID %>');
            cb.disabled = false;
            cb.parentNode.disabled = false;
        }


    </script>

    <div>
        <asp:CheckBox ID="CheckBox1" runat="server" Checked="true" Enabled="false" />
        <asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="buttonClick(); return false;" />
        <asp:Button ID="Button2" runat="server" Text="Button2" OnClick="button2Click" />
    </div>
    </form>
</body>
</html>

И код на стороне сервера:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ESC
{
    public partial class testcb : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }

        protected void button2Click(object sender, EventArgs e)
        {
            string h = "";
        }
    }
}

Итак, мы разбиваем строку «строка h» и проверяем значение CheckBox1.Checked. Это правда, даже если это не отмечено в форме.

Ответы [ 6 ]

34 голосов
/ 06 октября 2009

Это известная проблема с ASP.NET - по какой-то причине ASP.NET не будет обновлять флажок при обратной передаче, если он был отключен во время загрузки страницы и не проверен на обратную передачу. Хотя я точно не знаю, почему это так - если вы по умолчанию не устанавливаете флажок и выбираете его, значение на сервере корректно изменяется.

Обходной путь - добавить на страницу скрытое поле, которое представляет состояние флажка, а затем обновить значение поля, например, на «ВКЛ» или «ВЫКЛ» при каждом нажатии флажка.

Затем на сервере вы проверяете значение скрытого поля, а не сам флажок, поскольку скрытое поле всегда публикуется.

13 голосов
/ 17 августа 2011

У меня была проблема, аналогичная этой, когда свойство Checked объекта CheckBox не обновлялось правильно, чтобы получить фактическое объявленное значение, которое вы можете проверить:

Request.Form[CheckBox1.UniqueID]

это будет «включено», если флажок установлен, и ноль, если нет.

1 голос
/ 14 мая 2010

Возможно, я не правильно понимаю проблему, но вы не можете просто использовать форму из запроса для получения значения CheckBox?Так что в button2Click() в коде файла вы должны сделать это:

Request.Form[CheckBox1.UniqueID]
1 голос
/ 06 октября 2009

Поскольку вы уже используете Javascript для управления состоянием элементов управления в браузере, я советую вам просто отключить флажок на событии загрузки страницы вместо него. Тогда ваши постбэки будут работать нормально ...

<head>

  <script type="text/javascript">
    function buttonClick() {
      var cb = document.getElementById('<%= CheckBox1.ClientID %>');
      cb.disabled = false;
      cb.parentNode.disabled = false;
    }    
  </script>

</head>
<body onload="document.getElementById('<%= CheckBox1.ClientID %>').disabled = true;">
  <form id="form1" runat="server">
  <div>
    <asp:checkbox id="CheckBox1" runat="server" checked="true" />
    <asp:button id="Button1" runat="server" text="Button" onclientclick="buttonClick(); return false;" />
    <asp:button id="Button2" runat="server" text="Button2" onclick="button2Click" />
  </div>
  </form>
</body>
0 голосов
/ 19 ноября 2014

Вот альтернативное решение, если вам нужно избегать перекомпиляции исходного кода. Он просто включает флажок на долю секунды перед отправкой формы. 1: Добавьте следующий параметр в кнопку отправки: OnClientClick="EnableCheckbox()" 2: Добавьте эту простую функцию где-нибудь на странице, чтобы включить ее

<script> 
       function EnableCheckbox() {
            document.getElementById("<%=chkMyCheckbox.clientID  %>").disabled = false;
        } 
</script>
0 голосов
/ 07 июня 2013

Вы можете использовать что-то вроде этого.

if ((Request.Params["Checkbox1"] ?? "").ToString() == "on")

Если этот флажок не установлен, он не пройдет его в первую очередь, но это следует учитывать.

...