2009-10-06 16 views
20

हमारे पास एक चेकबॉक्स है जो प्रारंभ में अक्षम और चेक किया गया है। इसके बाद क्लाइंट पक्ष पर जावास्क्रिप्ट के माध्यम से सक्षम किया जाता है। यदि उपयोगकर्ता बॉक्स को अनचेक करता है और बटन को पोस्टबैक करने के लिए बटन दबाता है, तो चेकबॉक्स की स्थिति सर्वर की तरफ चेक की जाती है। यह स्पष्ट रूप से अवांछनीय व्यवहार है। यहाँ एक उदाहरण है।पोस्टबैक पर 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 = ""; 
     } 
    } 
} 

तो हम "स्ट्रिंग ज" लाइन में तोड़ने के लिए और CheckBox1.Checked का मूल्य की जाँच करें। यह सच है, भले ही यह फ़ॉर्म पर अनचेक किया गया हो।

+0

इसका कारण यह है अपने पृष्ठ के मद्देनजर राज्य अद्यतन हो रही नहीं है जब आप सेट किया गया है पीछे कोड से अपने नियंत्रण की गुण। –

+0

सर्वर नियंत्रण के बजाय एक HTML नियंत्रण का उपयोग करें और मुझे विश्वास है कि आपकी समस्या हल हो गई है। –

+1

@ कामरान, व्यूस्टेट समस्या नहीं है। –

उत्तर

32

यह एएसपी.नेट के साथ एक ज्ञात समस्या है - किसी कारण से एएसपी.NET पोस्टबैक पर चेकबॉक्स अपडेट नहीं करेगा अगर इसे पेज लोड के दौरान अक्षम किया गया था और पोस्टबैक के लिए चेक नहीं किया गया था। मुझे नहीं पता कि यह वास्तव में क्यों है - यदि आप डिफ़ॉल्ट रूप से चेकबॉक्स को अचयनित करते हैं और इसे चुनते हैं, तो सर्वर पर मूल्य सही ढंग से बदला जाता है।

वर्कअराउंड उस पृष्ठ पर एक छिपे हुए फ़ील्ड को जोड़ना है जो चेकबॉक्स की स्थिति का प्रतिनिधित्व करता है, फिर फ़ील्ड के मान को "चालू" या "बंद" पर अपडेट करें, उदाहरण के लिए, जब भी चेकबॉक्स क्लिक किया जाता है।

फिर सर्वर पर आप छिपे हुए फ़ील्ड का मान जांचते हैं, न कि चेकबॉक्स स्वयं, क्योंकि छुपा क्षेत्र हमेशा पोस्ट किया जाता है।

+0

यह काम करता है। धन्यवाद। – Anthony

+2

हाय सैम, क्या आप कृपया "कोनाउन समस्या" पर अधिक जानकारी दे सकते हैं? केबी या लिंक? मेरे पास "अनचेक" गायब होने के साथ एक चेकबॉक्स है; सक्षम == सही, चेक = ऑनइनिट छोड़ते समय झूठी; सक्षम == पृष्ठ_लोड दर्ज करते समय सही, चेक = सत्य; लेकिन यह ब्राउज़र से अनचेक किया गया है, और अगर यह एक और unrelease asyncpostback पहले हुआ था तो यह उम्मीद के रूप में काम करता है। –

1

चूंकि आप ब्राउज़र में नियंत्रण स्थिति में हेरफेर करने के लिए पहले ही जावास्क्रिप्ट का उपयोग कर रहे हैं, तो मेरा सुझाव है कि आप पेज लोड ईवेंट पर चेकबॉक्स को बस स्थिर करें। फिर अपने 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> 
+0

मैंने अपनी परियोजना में ऐसा कुछ किया। हालांकि सुरक्षा के लिए यह बहुत अच्छा नहीं है। यदि उपयोगकर्ता जावास्क्रिप्ट को अक्षम करता है, तो वह मूल रूप से बॉक्स को चेक करने में सक्षम होगा और बिना बाधा के सहेजें सहेजें दबाएगा। –

1

मैं सही ढंग से समस्या नहीं समझ सकते हैं, लेकिन आप केवल CheckBox मान प्राप्त करने के लिए अनुरोध से फार्म का उपयोग नहीं कर सकते हैं? तो फ़ाइल के पीछे कोड में button2Click() में आप यह करते हैं चाहते हैं:

Request.Form[CheckBox1.UniqueID] 
+2

नहीं, ब्राउज़र को अक्षम फॉर्म तत्वों के मूल्यों को पोस्टबैक करने की आवश्यकता नहीं है। – Tommy

12

मैं यह करने के लिए इसी तरह की एक समस्या जहां CheckBox वस्तु की जांच की गई संपत्ति को सही ढंग से अद्यतन नहीं किया जा रहा था, वास्तविक मूल्य आप कर सकते हैं तैनात पाने के लिए था जांचें:

Request.Form[CheckBox1.UniqueID] 

यदि बॉक्स चेक किया गया है और शून्य नहीं है तो यह 'चालू' होगा।

+0

(6 साल बाद ...) यह अजीब है। मेरा एएसपी.Net ऐप "कभी-कभी" मेरे एएसपी.Net चेकबॉक्स के लिए गलत चेक किए गए मान की रिपोर्टिंग करता है, और * कभी-कभी * यह सुझाव काम करता है ... अन्य बार यह अपवाद फेंकता है क्योंकि इस नियंत्रण का मान अनुरोध में नहीं मिलता है। फॉर्म वैल्यू ... –

0

आप इस तरह कुछ उपयोग कर सकते हैं।

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

यदि यह चेक नहीं किया गया है तो यह इसे पहले स्थान पर नहीं पारित करेगा, लेकिन इसके लिए इसका खाता होना चाहिए।

0

यदि आपको अपने स्रोत कोड को पुन: सम्मिलित करने से बचने की आवश्यकता है तो यहां एक वैकल्पिक समाधान है। यह फ़ॉर्म सबमिट करने से पहले एक स्प्लिट सेकेंड के लिए चेकबॉक्स को सक्षम बनाता है। 1: OnClientClick="EnableCheckbox()" 2: अपने सबमिट बटन के लिए निम्न पैरामीटर जोड़ें सक्षम करने के लिए पृष्ठ पर कहीं इस सरल समारोह जोड़े यह

<script> 
     function EnableCheckbox() { 
      document.getElementById("<%=chkMyCheckbox.clientID %>").disabled = false; 
     } 
</script> 
संबंधित मुद्दे