2010-12-04 13 views
5

मुझे एएसपी.नेट में निम्न समस्या है: एक ऐसा फॉर्म है जिसमें एक टेक्स्टबॉक्स और उसके बगल में एक बटन है जिसे बॉक्स भरने के बाद उपयोगकर्ता द्वारा दबाया जाना चाहिए (http://www.burnthespam.info पर नमूना, "अपना एक चुनें" पर क्लिक करें, या पॉपअप में रीकैप्चा का उपयोग करते समय)। अक्सर, इसके बजाय, उपयोगकर्ता फॉर्म सबमिट करने के लिए ENTER कुंजी दबाते हैं।टेक्स्टबॉक्स में एन्टर बटन को संभालना, एएसपी.नेट

इससे बटन पर क्लिक ईवेंट ट्रिगर नहीं होता है और संभवतः एक अप्रत्याशित व्यवहार का कारण बनता है। बर्नशैम में, मैंने टेक्स्ट बॉक्स के अंदर डेटा जांचने के लिए "कोशिश की" कोशिश की है (लेकिन अब अगर आप ENTER दबाकर कुछ अलग करते हैं तो यह आपको दबाएगा) इसे काम करने के लिए।

क्या आपको पता है कि ENTER कुंजी के साथ फ़ॉर्म सबमिशन को संभालने का कोई दूसरा तरीका है, या जावास्क्रिप्ट स्निपेट है कि जब आप ENTER दबाते हैं तो मुझे बटन पसंद होता है?

संपादित

मैं सर्वर साइड, यानी पर महत्वपूर्ण घटना ENTER हैंडल करना चाहते हैं। मैं पहले से ही

protected void button_Click(object sender, EventArgs e) 
    { 
     Response.Redirect(...); 
    } 

मुझे लगता है कि विधि न केवल नाम से जाना जब मैं बटन का उपयोग कर प्रपत्र सबमिट (क्लिक करें या इसे साथ अंतरिक्ष पर प्रकाश डाला), लेकिन एक उपयोगकर्ता ENTER प्रेस भी जब जब पाठ बॉक्स

ध्यान केंद्रित करना चाहते हैं

संपादित 2

क्या आप जानते हैं अगर यह प्रोग्राम के रूप में संभव है Javascript में एक बटन पर क्लिक करें? शायद फ़िशिंग/स्पैमिंग को रोकने के लिए संभव नहीं है (उदाहरण के लिए फेसबुक देखें और "दोस्तों को साझा करें") लेकिन मैं अभी भी पूछना चाहूंगा ...

उत्तर

0

फॉर्म ऑब्जेक्ट का उपयोग करके डिफ़ॉल्ट बटन सेट कर सकते हैं डिफ़ॉल्ट बटन डिफ़ॉल्ट संपत्ति या एक पैनल की डिफॉल्टबटन संपत्ति, लेकिन मैंने उन्हें विभिन्न ब्राउज़रों में अतीत में अविश्वसनीय पाया है, इसलिए आमतौर पर मैं जावास्क्रिप्ट पर भरोसा करता हूं।

इस कोड का एकमात्र नकारात्मक पक्ष आपको पृष्ठ निर्देश के साथ ईवेंट सत्यापन बंद करना होगा, लेकिन इसे ईवेंट पर क्लिक करना बंद कर देना चाहिए, और वैधकर्ताओं को ट्रिगर करना चाहिए।

यहां एक उदाहरण है जिसका हम उपयोग करते हैं। आम तौर पर मैं रजिस्टर फ़ंक्शन को उपयोगिता वर्ग में रखूंगा, लेकिन इस उदाहरण के लिए यह पृष्ठ कोड में है। इसे आज़माएं। ID जो आपके अपने बटन को सक्रिय करने के लिए मार्कअप में प्रदान की गई है, ClientID संपत्ति यानी साथ

<html> 
<head> 
<script type="text/javascript"> 
function test(e){ 
var keynum; 

if(window.event) // IE 
{ 
keynum = e.keyCode 
} 
else if(e.which) // Netscape/Firefox/Opera 
{ 
keynum = e.which 
} 
if(keynum==13) __doPostback('yourButtonId', ''); 
} 
</script> 
</head> 
<body> 
<input type="text" onkeypress="test(event)" /> 
</body> 
</html> 

आप बदलना भी होगा 'yourButtonId':

<%@ Page Language="C#" EnableEventValidation="false" %> 

    <script runat="server"> 

     protected void cmdSubmit1_Click(object sender, EventArgs e) 
     { 
      litValue.Text = "Value 1 - You entered: " + txtValue1.Text; 
     } 
     protected void cmdSubmit2_Click(object sender, EventArgs e) 
     { 
      litValue.Text = "Value 2 - You entered: " + txtValue2.Text; 
     } 

     /// <summary> 
     /// This function registers what button is clicked based on whatever control currently has focus 
     /// so for example if the user password field has focus then you can cause the enter button to click 
     /// if the enter key is pressed This works with ie and firefox as far as I know 
     /// </summary> 
     /// <param name="ControlWithFocus"></param> 
     /// <param name="ControlToClick"></param> 
     private void RegisterDefaultButton(System.Web.UI.Control ControlWithFocus, System.Web.UI.Control ControlToClick) 
     { 

      PostBackOptions p = new PostBackOptions(ControlToClick); 
      p.PerformValidation = true; 
      if (ControlToClick is Button) 
      { 
       p.ValidationGroup = ((Button)ControlToClick).ValidationGroup; 
      } 
      else if (ControlToClick is ImageButton) 
      { 
       p.ValidationGroup = ((ImageButton)ControlToClick).ValidationGroup; 
      } 
      else if (ControlToClick is LinkButton) 
      { 
       p.ValidationGroup = ((LinkButton)ControlToClick).ValidationGroup; 
      } 

      p.RequiresJavaScriptProtocol = false; 

      AttributeCollection a = null; 
      if (ControlWithFocus is HtmlControl) 
      { 
       a = ((System.Web.UI.HtmlControls.HtmlControl)ControlWithFocus).Attributes; 
      } 
      else if (ControlWithFocus is WebControl) 
      { 
       a = ((System.Web.UI.WebControls.WebControl)ControlWithFocus).Attributes; 
      } 

      if (a != null) 
      { 
       a["onKeyDown"] = string.Format("if (event.keyCode == 13) {{{0}}}" 
         , ControlToClick.Page.ClientScript.GetPostBackEventReference(p)); 
      } 
     } 


     protected void Page_Load(object sender, EventArgs e) 
     { 
      RegisterDefaultButton(txtValue1, cmdSubmit1); 
      RegisterDefaultButton(txtValue2, cmdSubmit2); 

     } 

    </script> 

    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head runat="server"> 
    </head> 
    <body> 
     <form id="form1" runat="server"> 
      Enter Value 1: <asp:TextBox ID="txtValue1" runat="server"></asp:TextBox> 
      <br /> 
      Enter Value 2: <asp:TextBox ID="txtValue2" runat="server"></asp:TextBox> 
      <br /> 
      <asp:Literal ID="litValue" runat="server"></asp:Literal> 
      <asp:LinkButton ID="cmdSubmit1" runat="server" Visible="false" OnClick="cmdSubmit1_Click">Hidden Button 1</asp:LinkButton> 
      <input id="cmdSubmit2" runat="server" visible="false" type="button" value="Hidden Button 2" onserverclick="cmdSubmit2_Click" /> 
     </form> 
    </body> 
+0

मैं सिर्फ देखा है कि आपके कोड, थोड़ा संशोधनों के साथ, बस IE8 द्वारा नजरअंदाज कर दिया जाता है, जबकि में फ़ायरफ़ॉक्स काम करता है। क्या यह इस तथ्य के कारण हो सकता है कि टेक्स्टबॉक्स एक गाया है: गाया AJAX WebWidgets से टेक्स्टबॉक्स और केवल पोस्टबैक के बाद दिखाई देता है? मैंने डबल-चेक किया है कि जेनरेट किया गया HTML बटन क्लिक के लिए एक से मेल खाता है, और मुझे ईवेंट सत्यापन अक्षम करने की आवश्यकता नहीं है (क्योंकि एफएफ काम करता है), लेकिन मुझे अभी भी एक खाली HTTP (एफएफ़ की तरह AJAX नहीं) पोस्टबैक –

+0

है अजीब। यदि जावास्क्रिप्ट वहां है, और यह बटन पर जावास्क्रिप्ट जैसा दिखता है और बटन काम करता है, तो कोई सोचता है कि टेक्स्टबॉक्स पर लिपि का एक ही परिणाम होना चाहिए। क्या यह संभव है कि गैया टेक्स्टबॉक्स ऑन-ऑनडाउन ईवेंट पर भी पंजीकरण कर रहा है और इससे वास्तव में इनलाइन स्क्रिप्ट को कॉल नहीं किया जा रहा है। आपको स्क्रिप्ट डीबगर का प्रयास करना चाहिए और देखें कि डोपॉस्टबैक विधि वास्तव में कहां जा रही है या नहीं। –

+0

इसका उपयोग करने की कोशिश कर रहा है ... मैंने इसे "अगर (event.keyCode == 13) {अलर्ट ('go');}" ... 'go' अलर्ट बॉक्स हर बार पॉप अप करता है, तो इसे ऑनकीवेंट को बदलकर काम कर रहा है। दर्ज क्लिक किया गया है। लेकिन जब मैं पृष्ठ में अपना मूल कोड वापस डालता हूं तो बस रीफ्रेश होता है और लिंकबटन के क्लिक ईवेंट को कभी नहीं कहा जाता है। कोई विचार? (मेरा कोड आपके उदाहरण के लगभग समान है, सिवाय इसके कि मेरे पास केवल एक लिंकबटन है जो टेक्स्टबॉक्स दोनों कॉल कर रहे हैं) मैं IE9 में इसका परीक्षण कर रहा हूं। – cavillac

2

आप इस कोशिश कर सकते। नेट कोड __doPostback फ़ंक्शन एक है जिसे .NET द्वारा परिभाषित किया गया है, उसके सभी पोस्टबैक को संभालने के लिए।

3

यहाँ एक आसान तरीका ASP.NET के लिए महान काम करता है:

अपने .aspx पेज

<script type="text/javascript"> 
     function clickButton(e, buttonid) { 
      var evt = e ? e : window.event; 
      var bt = document.getElementById(buttonid); 
      if (bt) { 
       if (evt.keyCode == 13) { 
        bt.click(); 
        return false; 
       } 
      } 
     } 
</script> 

में इस जोड़ें और अपने aspx में Page_Load पर इस जोड़ें।सीएस फ़ाइल

textbox1.Attributes.Add("onkeypress", "return clickButton(event,'" + buttonName1.ClientID + "')");