Подтвердить что ты не робот

Значение учетной записи ASP.Net при обратной передаче неверно?

У нас есть флажок, который первоначально отключен и проверен. Затем он активируется на стороне клиента через 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. Это правда, даже если он не отмечен в форме.

4b9b3361

Ответ 1

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

Обходной путь заключается в том, чтобы добавить скрытое поле к странице, которая представляет состояние флажка, а затем обновить значение поля до "ON" или "OFF", например, при каждом щелчке по кнопке.

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

Ответ 2

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

Request.Form[CheckBox1.UniqueID]

он будет 'on', если флажок установлен и null, если нет.

Ответ 3

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

<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>

Ответ 4

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

Request.Form[CheckBox1.UniqueID]

Ответ 5

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

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

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

Ответ 6

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

<script> 
       function EnableCheckbox() {
            document.getElementById("<%=chkMyCheckbox.clientID  %>").disabled = false;
        } 
</script>