2009-09-16 5 views
6

कर मैं एक रूप है जो, समस्या को अलग करने के लिए, लगभग एक दर्जन सादे HTML चेक बॉक्स (नहीं WebControls), जो सभी के विकलांग हैं की है। वे UpdatePanel के अंदर हैं।__DoPostback पदों वापस विकलांग नियंत्रण के मूल्यों जब एक आंशिक पोस्टबैक

मैं एक लिंक जो

__doPostBack('a-control','my-custom-argument');

कॉल पहला तर्क मैं आपूर्ति के आधार पर है, पेज एक पूर्ण postback या एक आंशिक एक कर सकते हैं।

जब मैं एक पूर्ण postback करता हूं, तो पोस्ट में कोई भी चेकबॉक्स मान सबमिट नहीं किया जाता है (क्योंकि वे अक्षम हैं)। यह सामान्य है और इस प्रकार वांछित व्यवहार है।

हालांकि, जब यह आंशिक postback करता है, तो स्क्रिप्ट मेरे चेकबॉक्स से सभी मान एकत्र करती है और यह बताती है कि कौन से लोगों को अक्षम किया गया था, जो मेरे कोड को तोड़ता है।

यह कष्टप्रद है और मैं इसे लगातार व्यवहार करना चाहता हूं। क्या दुनिया के बाकी हिस्सों के तरीके के लिए .NET जावास्क्रिप्ट हैंडलर को बताने के लिए वैसे भी है और postbackअक्षम HTML फॉर्म तत्वों के मान?

उत्तर

2

मैं दो विकल्पों का सुझाव कर सकते हैं:

1) तुम बस पोस्टबैक करने से पहले जावास्क्रिप्ट के साथ विकलांग नियंत्रण के name विशेषता निकाल सकते हैं।

2) कोड के सही संस्करण के साथ Sys.WebForms.PageRequestManager.getInstance()._onFormSubmit ओवरराइड करें। बस MicrosoftAjaxWebForms.debug.js से कार्यान्वयन कॉपी, disabled विशेषता के लिए एक से निपटने जोड़ने और मौजूदा विधियां वस्तु के लिए सही समारोह देते हैं:

Sys.WebForms.PageRequestManager.getInstance() ._ onFormSubmit = समारोह ...

तो रजिस्टर स्टार्टअप स्क्रिप्ट के रूप में यह जेएस ब्लॉक। प्रस्तुत स्क्रिप्ट ब्लॉक का सही क्रम प्राप्त करना महत्वपूर्ण है। मैं स्क्रिप्ट मैनेजर के अपने उप-वर्ग में एक समान काम करता हूं:

protected override void OnResolveScriptReference(ScriptReferenceEventArgs e) { 
    base.OnResolveScriptReference(e); 

    if (e.Script.Name.StartsWith("MicrosoftAjax")) 
     Page.ClientScript.RegisterStartupScript(GetType(), "My patch", MyPatchJs, true); 
} 

एक आकर्षण की तरह काम करता है!

3

मुझे एक बग की तरह लग रहा है। this अक्षम इनपुट के अनुसार फ़ॉर्म के साथ सबमिट किया जाना चाहिए। पुन: पेश करने

<%@ Page Language="C#" AutoEventWireup="true" Inherits="System.Web.UI.Page" EnableViewState="false" EnableEventValidation="false" Trace="false" %> 

<!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> 
    <title>Test disabled checkboxes</title> 
    <script> 
    initState = false; 
    function disableCheckboxes(disabled) { 
     document.getElementById('foo').disabled = disabled; 
    } 
    </script> 
</head> 
<body> 
<form id="form1" runat="server"> 
    <asp:ScriptManager runat="server" /> 

    <asp:UpdatePanel runat="server"> 
     <ContentTemplate> 
      <input runat="server" type="checkbox" id="foo" name="foo" checked="checked" /> Foo 
      <asp:Button ID="Inside" runat="server" Text="Submit Inside UpdatePanel" /> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

    <asp:Button ID="Outside" runat="server" Text="Submit Outside UpdatePanel" /> 
    <br /> 
    <button type="button" onclick="disableCheckboxes(initState=!initState)">Toggle checkboxes</button> 
</form> 
</body> 
</html> 

कदम::

यहाँ मेरा पूरा परीक्षण पृष्ठ है

  1. फ़िडलर और परीक्षण पृष्ठ खोलें।
  2. "अपडेट आउट पैनेल सबमिट करें" पर क्लिक करें (सामान्य पोस्टबैक ट्रिगर करता है)। फिडलर में नोट पोस्ट "foo=on" पोस्ट बॉडी में जमा किया गया है।
  3. चेकबॉक्स को अक्षम करने के लिए "चेकबॉक्स टॉगल करें" पर क्लिक करें।
  4. फिर से "अपडेट आउट पैनेल सबमिट करें" पर क्लिक करें। नोट करें पैरामीटर "foo" पोस्ट बॉडी से छोड़ा गया है। यह उम्मीद है।
  5. "अपडेट पैनेल के अंदर सबमिट करें" पर क्लिक करें (आंशिक पोस्टबैक ट्रिगर करता है)।नोट मूल्य "foo=on" पोस्ट शरीर में मौजूद है, भले ही यह छोड़ दिए गए हैं चाहिए

बग दोनों MicrosoftAjaxWebForms.js और MicrosoftMvcAjax.js (और .debug प्रत्येक की समकक्षों में प्रतीत होता है):

if ((type === 'text') || 
    (type === 'password') || 
    (type === 'hidden') || 
    (((type === 'checkbox') || (type === 'radio')) && element.checked)) { 
     formBody.append(encodeURIComponent(name)); 
     formBody.append('='); 
     formBody.append(encodeURIComponent(element.value)); 
     formBody.append('&'); 
} 

तत्व पर disabled विशेषता धारावाहिक की जा रही सी है फॉर्म सबमिशन कार्यान्वयन के spec और de-facto व्यवहार के खिलाफ जाकर, पूरी तरह से अनदेखा किया।

2

नेट में फॉर्म टैग में submitdisabledcontrols विशेषता है, जो गलत पर डिफ़ॉल्ट है। यदि आप इसे सत्य पर सेट करते हैं तो आप कम से कम चीजों को लगातार व्यवहार कर सकते हैं।

संबंधित मुद्दे