2009-06-15 10 views
50

मैं इस उम्मीद करेंगे:एएसपी.Net रेडियोबटन और चेकबॉक्स एक अवधि के अंदर क्यों प्रस्तुत करता है?

<input id="CheckBox1" type="checkbox" class="myClass" /> 
<input id="RadioButton1" type="radio" class="myClass" /> 
<input id="TextBox1"  type="text"  class="myClass" /> 

... जब वास्तव में, RadioButton और CheckBox:

<asp:CheckBox ID="CheckBox1" runat="server" CssClass="myClass" /> 
<asp:RadioButton ID="RadioButton1" runat="server" CssClass="myClass" /> 
<asp:TextBox  ID="TextBox1"  runat="server" CssClass="myClass" /> 

... इस की तरह प्रस्तुत करना (सादगी के लिए हटाया कुछ विशेषताओं के साथ) span टैग के साथ लपेटें और सीएसएस कक्षा वहां लागू हो जाती है।

<span class="myClass"><input id="CheckBox1" type="checkbox" /></span> 
<span class="myClass"><input id="RadioButton1" type="radio" /></span> 
<input type="text" id="TextBox1" class="myClass" /> 

क्या इसके लिए कोई कारण है और इससे बचने का कोई तरीका है?

$("input.myClass") 

दी यह सिर्फ जा रहा है:: यह jQuery चयनकर्ताओं बदसूरत के बाद आप के साथ उन सभी को नहीं पकड़ सकते बनाता

$("input.myClass, span.myClass input") 

... लेकिन यह है कि बदसूरत है। मैं अपना खुद का चयनकर्ता लिख ​​सकता था, लेकिन फिर से उतना ही सुरुचिपूर्ण नहीं होना चाहिए जितना होना चाहिए।

+0

कैसे $ ("। MyClass") कैसे मुकाबला करें? – Hardwareguy

+1

कोई जवाब नहीं है, लेकिन केवल कम्योरेटिंग - जब मैंने कुछ साल पहले .NET प्लेटफॉर्म पर काम करना शुरू किया था और चेकबॉक्स के मूल्य को जानने के लिए जेएस का उपयोग कर रहा था, तो मैंने यह जानने का प्रयास करने में कुछ घंटे बिताए कि मेरे मूल्य क्यों नहीं थे चेतावनी। अनुमान लगाओ - अवधि टैग। मैंने हमेशा सोचा है कि एमएस ने अपने रेडियोबूटन और चेकबॉक्स के लिए अनावश्यक टैग क्यों जोड़े! – Dhana

+0

@ हार्डवेयरगू कभी-कभी वह अवधि होगी और कभी-कभी वह इनपुट भी होगी। यही दिक्कत है। $ ("input.myclass") थोड़ा अधिक विशिष्ट हो सकता है, लेकिन $ ("myClass") आपको एक ही सिरदर्द देगा। – Mark

उत्तर

42

System.Web.UI.WebControls में वेब नियंत्रण अलग-अलग ब्राउज़रों में अलग-अलग प्रस्तुत कर सकते हैं। आप उन तत्वों को हमेशा प्रस्तुत करने पर भरोसा नहीं कर सकते हैं। वे कुछ भी जोड़ सकते हैं जो उन्हें लगता है कि यह विशिष्ट ब्राउज़र में काम करने के लिए आवश्यक है।

यदि आप एचटीएमएल के रूप में नियंत्रण कैसे प्रदान करते हैं, इस पर कोई नियंत्रण रखना चाहते हैं, तो आपको इसके बजाय System.Web.UI.HtmlControls नामस्थान में नियंत्रणों का उपयोग करना चाहिए। यह है:

<input type="checkbox" id="CheckBox1" runat="server" class="myClass" /> 
<input type="radio" name="RadioButton1" runat="server" class="myClass" /> 
<input type="text" id="TextBox1" runat="server" class="myClass" /> 

वे अतिरिक्त HTML तत्व के रूप में प्रस्तुत करेंगे, बिना अतिरिक्त तत्व जोड़े गए हैं। इसका मतलब यह है कि आपको ब्राउजर संगतता की ज़िम्मेदारी लेनी होगी, क्योंकि नियंत्रण नहीं है। साथ ही, उन नियंत्रणों में WebControls नामस्थान में नियंत्रण की सभी सुविधाएं नहीं हैं।

+0

कितने पोस्टबैक होते हैं मुझे लगता है कि यह सिरदर्द का अधिक होगा। मैं मानता हूं कि हमें डिफ़ॉल्ट रूप से इन नियंत्रणों का उपयोग करना चाहिए और आवश्यकता होने पर वेबकंट्रोल तक पहुंचना चाहिए। – Mark

+14

यदि आप ऐसा करने जा रहे हैं, तो आप बस एएसपी.NET एमवीसी का उपयोग कर सकते हैं;) – womp

+5

@womp मुझे यह विकल्प पसंद आएगा। – Mark

5

प्रत्येक वेबकंट्रोल डिफ़ॉल्ट रूप से <span> टैग के रूप में प्रस्तुत करता है, साथ ही नियंत्रण लेखक जो भी कस्टम प्रतिपादन करता है।

कस्टम वेबकंट्रोल लिखते समय आमतौर पर आप जो करते हैं, उनमें से एक है "TagKey" संपत्ति को एक div, या किसी अवधि के अलावा कुछ प्रस्तुत करने के लिए ओवरराइड करना है। इस प्रॉपर्टी का डिफ़ॉल्ट मान HtmlTextWriterTag.Span है।

आप अपने चेकबॉक्स आइटम को उपclass कर सकते हैं और टैगकी संपत्ति को कुछ और प्रस्तुत करने के लिए ओवरराइड कर सकते हैं, लेकिन फिर आपको अपने सभी चेकबॉक्स को अपने संस्करण में बनाने के साथ सौदा करना होगा।

+0

मुझे लगता है कि आपको अपना जहर चुनना है। लगातार प्रतिपादन के लिए बदसूरत jQuery चयनकर्ता या sporadic subclassed नियंत्रण। यदि _all_ इनपुट नियंत्रण एक अवधि के साथ प्रदान किया जाता है तो मैं शांत रहूंगा। संगति एक आधा रास्ता सभ्य चीज है। – Mark

3

मैं इस मुद्दे पर आया और नियंत्रण एडाप्टर का उपयोग करके इसे हल करने का प्रयास किया गया।

रेडियो बटन सूची में ऐसा करने के उदाहरण के लिए here देखें।

मैं अपने RadioButtonAdaptor-

using System; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.Adapters; 

public class RadioButtonAdapter : WebControlAdapter 
{ 
    protected override void Render(HtmlTextWriter writer) 
    { 
     RadioButton targetControl = this.Control as RadioButton; 

     if (targetControl == null) 
     { 
      base.Render(writer); 

      return; 
     } 

     writer.WriteBeginTag("input"); 
     writer.WriteAttribute("type", "radio"); 
     writer.WriteAttribute("name", targetControl.GroupName); 
     writer.WriteAttribute("id", targetControl.ClientID);    

     if (targetControl.CssClass.Length > 0) 
     { 
      writer.WriteAttribute("class", targetControl.CssClass); 
     }  

     writer.Write(" />"); 

    } 
} 

के रूप में इस के साथ समाप्त हो गया और यह करने के लिए अपने ब्राउज़र फ़ाइल

<browser refID="Default"> 
     <controlAdapters>    
      <adapter controlType="System.Web.UI.WebControls.RadioButton" 
       adapterType="RadioButtonAdapter" /> 
     </controlAdapters> 
</browser> 
बेशक

, वहाँ इस के लिए कुछ कमियां हैं जोड़ा।the above link पर उल्लिखित लोगों के साथ, यदि आप सब कुछ लागू नहीं करते हैं तो आप कार्यक्षमता भी खो देते हैं (उपरोक्त कोड रेडियो बटन की जांच करने की अनुमति नहीं देता है)। कुछ सीएसएस अनुकूल नियंत्रण एडाप्टर हैं, लेकिन वे रेडियो बटन नियंत्रण को कवर नहीं करते हैं। प्रारंभिक बिंदु के रूप में डिफ़ॉल्ट नियंत्रण एडाप्टर प्राप्त करने के लिए परावर्तक का उपयोग करना संभव हो सकता है।

+0

मुझे यह सुझाव पसंद है! देर से टिप्पणी मुझे पता है, लेकिन इससे आज मुझे बहुत मदद मिली! –

104

यह मुझे तब तक पागल कर रहा था जब तक मुझे इनपुट एट्रिब्यूट्स संपत्ति नहीं मिली।

उदाहरण के लिए, यहाँ अवधि बकवास बिना चेकबॉक्स नियंत्रण पर सीधे एक वर्ग को जोड़ने का तरीका है:

myCheckBoxControl.InputAttributes.Add("class", "myCheckBoxClass") 
+7

यदि मैं कर सकता, तो मैं +100 दूंगा, क्योंकि मैं +1 देने में असमर्थ हूं :) धन्यवाद! – k25

+6

ग्रेट जॉब इसे ढूंढ रहा है। यह भी ध्यान रखें कि 'लेबल एट्रिब्यूट्स' इसी प्रकार के चेकबॉक्स लेबल शैली के अनुसार काम करता है। – magnattic

+0

यह अजीब है क्योंकि 'myCheckBoxControl.Attributes.Add' उसी व्यवहार को' myCheckBoxControl.CssClass 'के रूप में ट्रिगर करेगा जहां यह इसे '' टैग में लपेटता है, लेकिन 'myCheckBoxControl.InputAttributes.Add' नहीं होगा - हाँ! –

0

मिले वही समस्या,/अक्षम चेकबॉक्स और माता पिता अवधि

सक्षम करने के लिए एक सरल jQuery आधारित समारोह लिखा था

 

    public class HtmlTextWriterNoSpan : HtmlTextWriter 
    { 
     public HtmlTextWriterNoSpan(TextWriter textWriter) : base(textWriter) 
     { 
     } 

     protected override bool OnTagRender(string name, HtmlTextWriterTag key) 
     { 
      if (name == HtmlTextWriterTag.Span) 
      { 
       return false; 
      } 

      return base.OnTagRender(name, key); 
     } 
    } 
 

मैं उपयोग करने के लिए:

function resetChk(ctl, bEnable) { 

      if (bEnable){ 
       ctl.removeAttr('disabled').parent().removeAttr('disabled'); 
      }else{ 
       ctl.attr('disabled', true).parent().attr('disabled', true); 
      } 

     } 
0

सबसे अच्छा तरीका है मुझे लगता है कि यह है कस्टम नियंत्रण में टी:

 

    protected override void Render(HtmlTextWriter writer) 
    { 
     writer = new HtmlTextWriterNoSpan(writer); 
     base.Render(writer); 
     // HERE MORE CODE 
    } 
 
1

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

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