2009-10-06 5 views
20

最初に無効になっているチェックボックスがチェックされています。その後、javascriptを使用してクライアント側で有効になります。ユーザがボックスのチェックを外してボタンを押してポストバックを呼び出すと、チェックボックスの状態はサーバ側でチェックされたままになります。これは明らかに望ましくない動作です。ここに例があります。ASP.Netポストバック時のチェックボックスの値が間違っていますか?

<%@ 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の値を確認してください。それがフォーム上でチェックされていなくても、それは本当です。

+0

、それを有効にするには、ページのどこかに、この単純な機能を追加するには、送信ボタンに次のパラメータを追加します。コードの背後からコントロールのプロパティ。 –

+0

サーバーコントロールの代わりにHTMLコントロールを使用して、私はあなたの問題が解決されたと信じています。 –

+1

@Kamran、Viewstateは問題ではありません。 –

答えて

32

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

回避策は、チェックボックスの状態を表す隠しフィールドをページに追加し、チェックボックスをクリックするたびにフィールドの値を "ON"または "OFF"に更新することです。

次に、サーバー上で、非表示フィールドが常に転記されるので、チェックボックス自体ではなく、非表示フィールドの値をチェックします。

+0

これは動作します。ありがとう。 – Anthony

+2

こんにちはSamさん、 "konown problem"の詳細を教えてください。 KBまたはリンク? 「チェックを外す」チェックボックスがありません。 enabled == OnInitから出るときはtrue、checked = false、 enabled == Page_loadを入力すると、true、checked = trueになります。 しかし、それはブラウザからチェックされておらず、別の未発表のasyncpostbackが以前に起こった場合、期待通りに動作します。 –

1

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

私は私のプロジェクトに似た何かをしました。しかし、それはセキュリティのためにはあまり良くありません。ユーザーがJavascriptを無効にすると、基本的にはチェックボックスをオンにして、[妨げにならずに保存]を押すことができます。 –

1

私は問題を正しく理解していないかもしれないが、あなただけのCheckBox値を取得するリクエストからフォームを使用することはできませんか?だから、あなたがこれを行うだろうと分離コードファイル内button2Click()に:

Request.Form[CheckBox1.UniqueID] 
+2

無効なフォーム要素の値をポストバックするブラウザはありません。 – Tommy

12

私がすることができます実際の投稿の値を取得するために、CheckBoxオブジェクトのCheckedプロパティが正しく更新されていませんでしたこれと同様の問題を抱えていましたチェック:

Request.Form[CheckBox1.UniqueID] 

チェックボックスがオンの場合はオン、そうでない場合はnullになります。

+0

(6年後...)それは奇妙です。私のASP.Netアプリケーションは "時々"私のASP.Netチェックボックスの間違ったチェック値を報告しています*時々*この提案は動作します...このコントロールの値がリクエストに見つからないので例外をスローします。フォームの値... –

0

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

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

チェックされていない場合は、最初にそれを渡すことはありませんが、これを考慮する必要があります。

0

ソースコードを再コンパイルしないようにする必要がある場合は、代わりの方法があります。 フォームを送信する前に、1秒間だけチェックボックスを有効にするだけです。 1:OnClientClick="EnableCheckbox()" 2:あなたが設定したときに、ページのビューステートが更新取得されていないので、これがある

<script> 
     function EnableCheckbox() { 
      document.getElementById("<%=chkMyCheckbox.clientID %>").disabled = false; 
     } 
</script> 
関連する問題