2008-09-15 10 views
7

मैं किसी वेबसाइट पर कुछ सीएसएस को दोबारा कर रहा हूं। मैं काम कर रहा हूं, और कोड में पारंपरिक एचटीएमएल आईडी की अनुपस्थिति पर ध्यान दिया।मैं एक एएसपीनेट रनैट = 'सर्वर' टैग के साथ पारंपरिक HTML आईडी विशेषता का उपयोग कैसे कर सकता हूं?

CssClass='…' का भारी उपयोग होता है, या कभी-कभी केवल class='…' है, लेकिन मुझे id = '& hellip;' कहने का कोई तरीका नहीं दिख रहा है। और यह सर्वर द्वारा बाहर swapped नहीं है।

यहाँ एक उदाहरण है:

<span id='position_title' runat='server'>Manager</span> 

प्रतिक्रिया सर्वर से वापस आता है, मैं:

<span id='$aspnet$crap$here$position_title'>Manager</span>

किसी भी मदद के लिए यहाँ?

उत्तर

1

नेट हमेशा आपके आईडी मानों को कुछ उलझन में बदल देगा (प्रत्येक इतनी कम अनुमानित है, लेकिन फिर भी उस पर भरोसा नहीं है) मूल्य। क्या आपको वास्तव में उस आईडी रनैट = सर्वर की आवश्यकता है? यदि आप runat = सर्वर में नहीं डालते हैं, तो यह इसे उलझन में नहीं रखेगा ...

जोड़ा गया: लेडेट की तरह, आप क्लाइंट आईडी का उपयोग कर अवधि (या किसी भी runat = सर्वर के साथ आईडी) का संदर्भ दे सकते हैं , लेकिन मुझे नहीं लगता कि सीएसएस में काम करता है।

लेकिन मुझे लगता है कि यदि आपका सीएसएस आईडी आधारित चयनकर्ताओं का उपयोग कर रहा है तो आपको बड़ी समस्या है। आप एक आईडी का पुनः उपयोग नहीं कर सकते हैं। आपके पास एक ही आईडी पर एक ही आईडी के साथ कई आइटम नहीं हो सकते हैं। नेट इसके बारे में शिकायत करेंगे।

तो, इस बात को ध्यान में रखते हुए, क्या सीएसएस को दायरे में थोड़ी बड़ी हो रही है?

5

आईडी के सामने रखा गया 'बकवास' नियंत्रण के कंटेनर से संबंधित है और इस व्यवहार को रोकने के लिए कोई रास्ता नहीं है (जहां तक ​​मुझे पता है), इसे किसी भी कंटेनर में डालने के अलावा ।

आप स्क्रिप्ट में आईडी का उल्लेख करने की जरूरत है, तो आप ClientID नियंत्रण के इतने की तरह उपयोग कर सकते हैं,:

<script type="text/javascript"> 
    var theSpan = document.getElementById('<%= position_title.ClientID %>'); 
</script> 
+0

ध्यान दें कि यह आपकी सीएसएस समस्या को ठीक नहीं करेगा क्योंकि आप बाहरी तकनीक फ़ाइल में इस तकनीक का उपयोग नहीं कर सकते हैं। यदि आपको वास्तव में अपने सीएसएस में आईडी का उपयोग करने की आवश्यकता है, तो आपको तत्व को runat = "server" के रूप में चिह्नित करने का कोई तरीका खोजने का प्रयास करना चाहिए। शायद एक <एएसपी: शाब्दिक ... /> के साथ? –

0

ठीक है, मुझे लगता है कि जूरी इस पर बाहर है।

@leddt, मुझे पहले से ही पता था कि 'बकवास' इसके आसपास के कंटेनर था, लेकिन मैंने सोचा कि शायद माइक्रोसॉफ्ट अकेले आईडी छोड़ने के लिए एक पिछवाड़े छोड़ देगा। क्लाइंट आईडी सहित प्रत्येक उपयोग पर सीएसएस फ़ाइलों को पुन: उत्पन्न करना एक भयानक विचार होगा।

मुझे या तो कक्षाओं का उपयोग करने के साथ छोड़ दिया गया है, या सीएसएस में कुछ खराब दिखने वाली आईडी हार्डकोड की गई हैं।

+0

यदि आपको वास्तव में अपने सीएसएस में आईडी का उपयोग करने की आवश्यकता है, तो आपको तत्व को runat = "server" के रूप में चिह्नित करने का कोई तरीका खोजने का प्रयास करना चाहिए। शायद एक <एएसपी: शाब्दिक ... /> के साथ? –

+0

<एएसपी: शाब्दिक आईडी = "whatever_content" runat = "सर्वर" /> आप कोड में शाब्दिक की सामग्री के सेट कर सकते हैं, और यह किसी से घिरा हुआ नहीं की जाएगी अतिरिक्त टैग –

0

@ मैट डॉड्डी: सीएसएस में आईडी के लिए कुछ शानदार उपयोग हैं, मुख्य रूप से जब आप एक तत्व को स्टाइल करना चाहते हैं जिसे आप जानते हैं कि वेबसाइट या पेज, जैसे लॉगआउट बटन या मास्टहेड में केवल एक बार दिखाई देता है।

+0

@ जेरेड। मेरा सुझाव इस तरह से नहीं आया था जैसा कि मेरा मतलब था - हाँ, आपके द्वारा सुझाए गए कार्यों के लिए कुछ बहुत ही वैध कारण हैं। मेरा कहना था कि नेट वास्तव में सहमत नहीं है। शुभकामनाएं! –

0

यदि आप span तक पहुंच रहे हैं या जो भी टैग आपको सी # या वीबी कोड से समस्याएं दे रहा है, तो runat="server" रहना होगा और आपको <span class="some_class" id="someID"> के बजाय उपयोग करना चाहिए। यदि आप पीछे दिए गए कोड में टैग तक नहीं पहुंच रहे हैं, तो runat="server" हटा दें।

0

यहां करने के लिए सबसे अच्छी बात यह एक अद्वितीय वर्ग का नाम है।

0

आपको अवधि से रनैट = "सर्वर" को हटाने की संभावना है और फिर अवधि के भीतर रखें ताकि आप अवधि को स्टाइल कर सकें और अभी भी गतिशील आंतरिक सामग्री हो।

कोई सुरुचिपूर्ण या आसान समाधान नहीं है (और इसके लिए एक पुन: संकलन की आवश्यकता है), लेकिन यह काम करता है।

6

jQuery उपयोग तत्व का चयन करने:

$("span[id$='position_title']").... 

jQuery के लचीला चयनकर्ताओं, विशेष रूप से अपने/'चयनकर्ताओं के साथ समाप्त होता' 'के साथ शुरू होता' (चयनकर्ता ऊपर दिखाया गया है 'के साथ समाप्त', एक शानदार तरीका के आसपास प्रदान करते हैं । ASP.NET के डोम आईडी Munge

0

मैं आईडी mangling से नेट को रोकने के लिए एक तरह से के बारे में पता नहीं है, लेकिन मैं कुछ तरीके के बारे में सोच सकते हैं आरपी उसके चारों ओर काम करने के लिए:

1 - नेस्ट फैला, runat = "सर्वर" के साथ एक, एक के बिना:

<style type="text/css"> 
#position_title { // Whatever 
} 
<span id="position_titleserver" runat="server"><span id="position_title">Manager</span></span> 

2 - के रूप में जोएल Coehoorn सुझाव दिया, एक अद्वितीय वर्ग के नाम का उपयोग करें। कुछ के लिए कक्षा का उपयोग कर रहे हैं? कोई फर्क नहीं पड़ता, आप 1 से अधिक का उपयोग कर सकते हैं! यह ...

<style type="text/css"> 
.position_title { font-weight: bold; } 
.foo { color: red; } 
.bar { font-style: italic; } 
</style> 
<span id="thiswillbemangled" class="foo bar position_title" runat="server">Manager</span> 

... इस प्रदर्शन करेंगे:

प्रबंधक

3 - पृष्ठ लोड के बाद आईडी ठीक करने के लिए एक जावास्क्रिप्ट समारोह लिखें

function fixIds() 
{ 
    var tagList = document.getElementsByTagName("*"); 
    for(var i=0;i<tagList.length;i++) 
    { 
     if(tagList[i].id) 
     { 
      if(tagList[i].id.indexOf('$') > -1) 
      { 
       var tempArray = tagList[i].id.split("$"); 
       tagList[i].id = tempArray[tempArray.length - 1]; 
      } 
     } 
    } 
} 
0

यदि आप कक्षाबद्ध से डर रहे हैं, तो किसी माता-पिता या बच्चे चयनकर्ता पर आईडी का उपयोग करने का प्रयास करें जिसमें वह तत्व शामिल है जिसे आप चाहते हैं ओ शैली। इस मूल तत्व में रनैट सर्वर लागू नहीं होना चाहिए। सीधे शब्दों में कहें, अपने संरचनात्मक कंटेनर को पीछे कोड चलाने के लिए योजना बनाना एक अच्छा विचार है (यानी कोई रनैट नहीं), इस तरह आप गैर-परिवर्तित आईडी का उपयोग करके अपने एप्लिकेशन/साइट के प्रमुख हिस्सों तक पहुंच सकते हैं। यदि ऐसा करने में बहुत देर हो चुकी है, तो एक रैपर div/span जोड़ें या उल्लिखित वर्ग समाधान का उपयोग करें।

0

क्या कोई विशेष कारण है कि आप नियंत्रण को runat = "server" होना चाहते हैं?

यदि ऐसा है, तो मैं < एएसपी का उपयोग दूसरा: लिटल>। । ।

यह आपके लिए काम करना चाहिए क्योंकि आप अभी भी कोड में डेटा को संपादित करने में सक्षम होंगे।

0

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

1

आप अपने सीएसएस को पृष्ठ के भीतर एम्बेड कर सकते हैं, समस्या को दूर करने के लिए कुछ सर्वर टैग के साथ छिड़काव कर सकते हैं। रनटाइम पर कोड ब्लॉक को एएसपी.नेट जेनरेट आईडी के साथ बदल दिया जाएगा।

उदाहरण के लिए:

[शैली type = "text/css"] # <% = AspNetId.ClientID%> { ... शैलियों यहाँ जाना ... } [/ शैली]

[स्क्रिप्ट प्रकार = "टेक्स्ट/जावास्क्रिप्ट"] document.getElementById ("<% = AspNetId.ClientID%>"); [/ स्क्रिप्ट]

आप कुछ और आगे जा सकते हैं और कुछ कोड फाइलें जो सीएसएस उत्पन्न करती हैं, अगर आप अपने सीएसएस को एक अलग फ़ाइल में रखना चाहते हैं।

इसके अलावा, मैं यहां कुछ बंदूक कूद रहा हूं, लेकिन आप एएसपी.नेट एमवीसी सामान का उपयोग कर सकते हैं (अभी तक आधिकारिक तौर पर इस लेखन के रूप में जारी नहीं किया गया है) जो वेब फॉर्म से दूर हो जाता है और आपको कुल नियंत्रण देता है मार्कअप उत्पन्न हुआ।

0

मुझे यकीन है कि इससे पहले कम से कम once पूछा गया है। शब्द 'मुंगिंग' है। रिच स्ट्रैल ने 2006 में इसके बारे में post लिखा था।

1

अधिकांश फिक्सेस ने सुझाव दिया कि वह एक बहुत ही साधारण समस्या के लिए अधिक है। बस अलग-अलग divs और spans है जिसे आप सीएसएस के साथ लक्षित करते हैं। यदि आप आईडी का उपयोग करना चाहते हैं तो सीधे एएसपी.NET नियंत्रणों को लक्षित न करें।

<span id="FooContainer"> 
    <span runat="server" id="Foo" > 
     ...... 
    <span> 
    </span>