2011-12-27 22 views
10

में पाठ के अलावा इनपुट प्रकार के साथ अद्यतन पैनेल ISP.NET का उपयोग कर HTML5 को प्रस्तुत करने के लिए एक ओपन सोर्स प्रोजेक्ट विकसित कर रहा हूं। यहां आप एक नज़र डाल सकते हैं: http://asphtml5.codeplex.com/एचटीएमएल 5

अब मुझे 'टेक्स्ट' के अलावा अन्य इनपुट मानों को वापस पोस्ट करने में अद्यतन पैनल के साथ समस्या है। जैसा कि आप जानते हैं, एचटीएमएल 5 ने कई इनपुट प्रकार पेश किए हैं, उदाहरण के लिए 'नंबर', 'टेल', 'सर्च' इत्यादि। अब अगर मैं ऐसे नियंत्रण प्रस्तुत करता हूं, तो सबकुछ सामान्य परिस्थितियों में ठीक काम करता है, लेकिन अगर मैं उन्हें अंदर रखता हूं UpdatePanel, कोई मान वापस पोस्ट नहीं किया जाएगा और मान रीसेट हो जाएगा।

यहाँ है कि एक ही त्रुटि पैदा करता है कोड का एक छोटा सा टुकड़ा है:

<asp:UpdatePanel runat="server" ID="UP"> 
     <ContentTemplate> 
      <p> 
       Enter A Number: 
       <asp:TextBox runat="server" ID="Number2" type="number" /> 
      </p> 
      <asp:Button Text="Submit" runat="server" ID="BtnSubmit" OnClick="BtnSubmit_Click" /> 
      <p> 
       You entered : 
       <asp:Label Text="" ID="LblValue" runat="server" /> 
      </p> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

यदि आप एक ब्राउज़र एचटीएमएल 5 का समर्थन करता है कि इस कोड का परीक्षण करने देता एक उदाहरण के रूप क्रोम कहते हैं, एक संख्यात्मक ऊपर-नीचे क्षेत्र दिखाया जाएगा। लेकिन अगर आप सबमिट बटन पर क्लिक करते हैं, तो यह आपके द्वारा दर्ज किए गए मान को खो देगा।

 protected void BtnSubmit_Click(object sender, EventArgs e) 
     { 
      LblValue.Text = Number2.Text; 
     } 

क्या मैं पहले से ही की कोशिश की है पढ़ रही है UpdatePanel, ScriptManager और ScriptManagerProxy कक्षाएं कोड, कुछ नहीं मिला:

यहाँ ईवेंट हैंडलर के लिए कोड है।

मुझे लगता है कि मुझे उपयोग के लिए अपना खुद का अपडेटपेनल और/या स्क्रिप्ट मैनेजर क्लास बनाने की आवश्यकता हो सकती है।

क्या कोई मेरी मदद कर सकता है, और मुझे बता सकता है कि कहां जांचना है।

+0

नई MicrosoftAjaxWebForms.js की System.Web.Extensions विधानसभा संसाधन से (नेट परावर्तक के साथ) मशीनों पर संस्करण प्राप्त कर सकते इस भी है है प्रारंभिक पोस्टबैक के साथ करने के लिए। क्या आप क्लाइंट या सर्वर साइड स्क्रिप्ट मैनेजर बना सकते हैं ..? – MethodMan

+1

यह ASP.NET के अगली फिल्म में तय किया जाएगा: http://connect.microsoft.com/VisualStudio/feedback/details/651085/partial-postback-updatepanel-do-not-post-new-html5-input- फ़ील्ड-टाइप-नंबर –

+0

धन्यवाद @ टिम, लेकिन क्या निश्चित कोड प्राप्त करने और आंशिक रूप से इसे रिलीज़ करने का कोई तरीका है? या, क्या आपको पता है कि उन्होंने इसे ठीक करने के लिए क्या किया? मुझे लगता है कि जब तक मैं HTML5 नियंत्रण प्रकाशित कर रहा हूं, तब तक मैं इस समस्या के लिए ज़िम्मेदार हूं। –

उत्तर

2

ठीक है, तो मैंने इसे ठीक करने का एक तरीका निकाला। सबसे पहले मुझे कोड के साथ समस्या मिली जो टिम मेडोरा प्रदान की गई। यह सब this. संशोधक की गलती थी।

var _textTypes = /^(text|password|hidden|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i; 
function Sys$WebForms$PageRequestManager$_onFormSubmit(evt) { 
... 
if (_textTypes.test(type) || 
     (((type === 'checkbox') || (type === 'radio')) && element.checked)) { 
     formBody.append(encodeURIComponent(name)); 
     formBody.append('='); 
     formBody.append(encodeURIComponent(element.value)); 
     formBody.append('&'); 
... 
} 

अब मैं ScriptResource.axd में मेरी समारोह इंजेक्षन करना पड़ा: तो यह जावास्क्रिप्ट समस्या तय। अब के लिए मुझे लगता है कि काम करने लगता है:

मैंने कक्षा ScriptResouceHandler बनाया जो नामस्थान DotM.Html5.Handlers में System.Web.Handlers.ScriptResourceHandler फैलाता है।

अपने ProcessRequest में मैंने अपनी नौकरी करने के लिए base.ProcessRequest(context) कहा। लेकिन मैं अपने फ़ंक्शन को मूल फ़ंक्शन को प्रस्तुत करने के लिए जोड़ना चाहता था। मुझे पता चला कि यह तब हुआ जब एन्क्रिप्टेड ZSystem.Web.Extensions,4.0.0.0,,31bf3856ad364e35|MicrosoftAjaxWebForms.debug.js| पारित किया गया था।

एक और समस्या यह थी कि System.Web.Handlers.ScriptResourceHandler में, 'पेज। डेक्रिप्टस्ट्रिंग' विधि जो आंतरिक है, क्वेरी स्ट्रिंग पैरा को डिक्रिप्ट करने के लिए बुलाया जाता है। इसलिए प्रतिबिंब के माध्यम से उस विधि को आमंत्रित करने का कोई तरीका नहीं था।

यहाँ कोड है:

 protected sealed override void ProcessRequest(HttpContext context) 
     { 
      base.ProcessRequest(context); 
      if (CypherContainsAjax(context.Request.QueryString["d"])) 
       context.Response.Write(OnFormSubmit); 
     } 

     private bool CypherContainsAjax(string cypher) 
     { 
      var text = DecryptString(cypher); 
      if (text == null) 
       return true; //Then Add it everywhere. What else could I do? :D 
      return text.Contains("MicrosoftAjaxWebForms"); 
     } 

     private string DecryptString(string cypher) 
     { 
      if (PageDecryptString == null) 
       return null; 
      return (string)PageDecryptString.Invoke(null, new object[] { cypher }); 
     } 
     private static MethodInfo PageDecryptString; 
     static ScriptResourceHandler() 
     { 
      PageDecryptString = typeof(Page).GetMethod("DecryptString", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); 
     } 

आप इस बदसूरत हैकिंग किसी तरह कह सकते हैं ...

2

दिलचस्प बात यह है कि एएसपी.NET 4.0 AJAX फ्रेमवर्क एचटीएमएल 5 इनपुट प्रकारों (कोड देखें) के बारे में जागरूक प्रतीत होता है, फिर भी @TimSchmelter ने इंगित किया है, यह माइक्रोसॉफ्ट द्वारा एक बग के रूप में पुष्टि की गई है।

यह आपको व्यवहार को डीबग करने और/या डिफ़ॉल्ट व्यवहार को ओवरराइड करने और समाधान खोजने के लिए एक प्रारंभिक बिंदु दे सकता है।

यह भी इन इनपुट प्रकार के लिए सर्वर साइड प्रसंस्करण कोड पर एक त्रुटि है, हालांकि मुझे यकीन है कि क्यों वे चाहिए/एक सामान्य पोस्टबैक बनाम एक async पोस्टबैक के बारे में परवाह नहीं कर रहा हूँ हो सकता है।

this._textTypes = /^(text|password|hidden|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i; 

function Sys$WebForms$PageRequestManager$_onFormSubmit(evt) { 
     var i, l, continueSubmit = true, 
      isCrossPost = this._isCrossPost; 
     this._isCrossPost = false; 
     if (this._onsubmit) { 
      continueSubmit = this._onsubmit(); 
     } 
     if (continueSubmit) { 
      for (i = 0, l = this._onSubmitStatements.length; i < l; i++) { 
       if (!this._onSubmitStatements[i]()) { 
        continueSubmit = false; 
        break; 
       } 
      } 
     } 
     if (!continueSubmit) { 
      if (evt) { 
       evt.preventDefault(); 
      } 
      return; 
     } 
     var form = this._form; 
     if (isCrossPost) { 
      return; 
     } 
     if (this._activeDefaultButton && !this._activeDefaultButtonClicked) { 
      this._onFormElementActive(this._activeDefaultButton, 0, 0); 
     } 
     if (!this._postBackSettings || !this._postBackSettings.async) { 
      return; 
     } 
     var formBody = new Sys.StringBuilder(), 
      count = form.elements.length, 
      panelID = this._createPanelID(null, this._postBackSettings); 
     formBody.append(panelID); 
     for (i = 0; i < count; i++) { 
      var element = form.elements[i]; 
      var name = element.name; 
      if (typeof(name) === "undefined" || (name === null) || (name.length === 0) || (name === this._scriptManagerID)) { 
       continue; 
      } 
      var tagName = element.tagName.toUpperCase(); 
      if (tagName === 'INPUT') { 
       var type = element.type; 
       if (this._textTypes.test(type) 
        || ((type === 'checkbox' || type === 'radio') && element.checked)) { 
        formBody.append(encodeURIComponent(name)); 
        formBody.append('='); 
        formBody.append(encodeURIComponent(element.value)); 
        formBody.append('&'); 
       } 
      } 
      else if (tagName === 'SELECT') { 
       var optionCount = element.options.length; 
       for (var j = 0; j < optionCount; j++) { 
        var option = element.options[j]; 
        if (option.selected) { 
         formBody.append(encodeURIComponent(name)); 
         formBody.append('='); 
         formBody.append(encodeURIComponent(option.value)); 
         formBody.append('&'); 
        } 
       } 
      } 
      else if (tagName === 'TEXTAREA') { 
       formBody.append(encodeURIComponent(name)); 
       formBody.append('='); 
       formBody.append(encodeURIComponent(element.value)); 
       formBody.append('&'); 
      } 
     } 
     formBody.append("__ASYNCPOST=true&"); 
     if (this._additionalInput) { 
      formBody.append(this._additionalInput); 
      this._additionalInput = null; 
     } 

// truncated for length 
+0

धन्यवाद टिम, मैं और पर्याप्त काम कर के रूप में आप का सुझाव दिया ... –

+1

फिर से दिलचस्प, क्लाइंट साइड कोड है कि मेरी परीक्षा आवेदन में प्रदान की गई है, regex आपके द्वारा दी गई उपयोग नहीं करता। यह केवल 'टेक्स्ट', 'पासवर्ड' और 'छिपा' प्रकारों की जांच करता है। और जब मैंने क्रोम के कंसोल के साथ अपना नंबर इनपुट जोड़ा, तो यह ठीक काम करता था। अब मैं उस समारोह को हैक करने का एक तरीका ढूंढ रहा हूं और मुझे उम्मीद है कि यह काम करेगा। –

+0

@ मज़ीरथाहेरी - एएसपी.नेट विभिन्न ब्राउज़रों को अलग-अलग स्क्रिप्ट भेज रहा था, लेकिन मैंने क्लाइंट-साइड स्क्रिप्ट को खींचने के लिए क्रोम का उपयोग किया, जिसमें डीआईडी ​​में विभिन्न टेक्स्ट प्रकार शामिल थे। मुझे लगता है कि सबसे अच्छा जवाब सभी मामलों में _textTypes संपत्ति को ओवरराइड करना है। यदि आपको वास्तविक कोड खोजने में मदद की ज़रूरत है, तो मुझे बताएं। मेरा मानना ​​है कि यह सिर्फ जेएस ऑब्जेक्ट की "सार्वजनिक" संपत्ति है। –

1

यह पहले से ही में नेट 4 विश्वसनीयता अद्यतन 1 (तय किया गया था वहाँ भी एक संस्करण 2 है, लेकिन यह पहले एक सम्मिलित नहीं होती): http://support.microsoft.com/kb/2533523

लेकिन अगर आप AjaxControlToolkit उपयोग कर रहे हैं, यह अपने स्वयं के आंतरिक MicrosoftAjaxWebForms.js जो एक पुराने कांटा है का उपयोग करता है, और वहाँ अभी भी इसके लिए कोई आधिकारिक ठीक है - आप उपयोग कर सकते हैं मेरा समाधान यहां से: http://ajaxcontroltoolkit.codeplex.com/workitem/27041

तो - आप या तो अपनी परियोजना के साथ तय हो गई ToolkitScriptManager (एक ब्लोट, मुझे पता है) शामिल कर सकते हैं, या आप वेनिला ScriptManager गुण AjaxFrameworkMode = "स्पष्ट" के साथ प्रयोग करके MicrosoftAjaxWebForms.js के नए संस्करण शामिल करने के लिए कोशिश कर सकते हैं, स्क्रिप्ट या समग्र स्क्रिप्ट।

Use the AjaxFrameworkMode property to enable all Microsoft Ajax script files, to disable all Microsoft Ajax script files, or to explicitly include individual script files.

The Scripts collection does not contain the core Microsoft Ajax Library scripts. The scripts in the core library are rendered automatically; they do not have to be registered with the ScriptManager control. However, if you want to override a core script or any control script and substitute a different version of the script, you can add your version to the Scripts collection.

<asp:ScriptManager runat="server"> 
    <Scripts> 
    <asp:ScriptReference Path="~/MicrosoftAjaxWebForms.js" /> 
    </Scripts> 
</asp:ScriptManager> 

मेरा मानना ​​है कि आप के साथ स्थापित विश्वसनीयता अद्यतन 1.