web-dev-qa-db-ja.com

ポストバック時の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 = "";
        }
    }
}

したがって、「string h」行で中断し、CheckBox1.Checkedの値を確認します。フォームでオフになっている場合でも同様です。

24
Anthony

これはASP.NETの既知の問題です。何らかの理由により、ページの読み込み中にチェックボックスがオフになっていて、ポストバックがチェックされていない場合、ASP.NETはチェックボックスを更新しません。その理由は正確にはわかりません。デフォルトでチェックボックスをオフにして選択すると、サーバーで値が正しく変更されます。

回避策は、チェックボックスの状態を表す非表示フィールドをページに追加し、チェックボックスがクリックされるたびに、たとえばフィールドの値を「ON」または「OFF」に更新することです。

次に、サーバーでチェックボックス自体ではなく、非表示フィールドの値を確認します。非表示フィールドは常に投稿されるためです。

34
Sam

CheckBoxオブジェクトのCheckedプロパティが正しく更新されず、確認できる実際のポストされた値を取得するという、これと同様の問題がありました。

Request.Form[CheckBox1.UniqueID]

ボックスがチェックされている場合は「オン」になり、チェックされていない場合はnullになります。

15
Kurt Vining

ブラウザーでコントロールの状態を操作するために既に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>
1
Jakob Gade

問題を正しく理解していない可能性がありますが、リクエストのフォームを使用してCheckBox値を取得できませんか?したがって、コードビハインドファイルのbutton2Click()では、次のようにします。

Request.Form[CheckBox1.UniqueID]
1
goku_da_master

このようなものを使用できます。

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

チェックされていない場合、そもそも通過しませんが、これはそれを考慮に入れるべきです。

0
Underground

ソースコードの再コンパイルを回避する必要がある場合の代替ソリューションを次に示します。フォームを送信する前に、一瞬だけチェックボックスをオンにします。 1:次のパラメーターを送信ボタンに追加します。OnClientClick="EnableCheckbox()" 2:このシンプルな関数をページのどこかに追加して、有効にします

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