2008-09-02 16 views
20

मैं आजकल व्यापार द्वारा एक सूचना वास्तुकार और जावास्क्रिप्ट डेवलपर हूं, लेकिन हाल ही में मैं फिर से बैक-एंड कोडिंग में वापस आ रहा हूं। और, हमारे सी #-आधारित सीएमएस के साथ एकीकृत और काम कर रहे एचटीएमएल प्रोटोटाइप को प्राप्त करने की कोशिश करते हुए, मैं एचटीएमएल आईडी विशेषताओं पर मनमाने ढंग से पुनः लिखने के लिए फॉर्म तत्वों के लिए हमारे प्रोग्रामर के साथ उड़ा रहा हूं।क्या मैं .NET खाने की आईडी रोक सकता हूं?

मैं .NET बदलती आईडी के लिए कोड-पीछे तर्क को समझ सकता हूं, लेकिन तथ्य यह है कि आप विकसित करने का प्रयास करते समय आईडी का उपयोग नहीं कर सकते हैं। jQuery बढ़ाया इंटरफेस कुछ घर्षण पैदा कर रहा है। मैं इसके आसपास काम करने के लिए क्या कर सकता हूं?

मैंने इसके बजाय क्लास एट्रिब्यूट का उपयोग करने का प्रयास किया है, लेकिन यह वास्तव में क्रैपी है, इसका मतलब यह नहीं है कि इसका क्या मतलब है और फ्लाई पर प्रभावी ढंग से परिवर्तित स्रोत को बदलने के .NET की उस समस्या के आसपास नहीं है। इसका मतलब यह भी है कि सीएसएस अब कम उपयोगी है और बनाने और बनाए रखने के लिए कम कुशल है।

किसी भी सुझाव या सलाह बहुत सराहना - कुछ कम रातों की नींद हराम के लिए कुछ भी ...

उत्तर

25

कम जवाब नहीं है, webforms साथ आईडी हमेशा तत्व के घोंसले के आधार पर फिर से लिखा जा सकता है। आप क्लाइंट आईडी संपत्ति के माध्यम से आईडी तक पहुंच प्राप्त कर सकते हैं, ताकि आप पृष्ठ/नियंत्रण के अंत में एक स्क्रिप्ट में आईडी को चर में सेट कर सकें और फिर उन्हें jQuery में डाल दें।

कुछ इस तरह:

<asp:button id="ImAButton" runat="server">Click Me</asp:button> 

<script type="text/javascript"> 
var buttonId = "<%=ImAButton.ClientId%>"; 
$("#"+buttonId).bind('click', function() { alert('hi); }); 
</script> 

यह एक हैक मुझे पता है, लेकिन यह काम करेंगे। (मैं के लिए ध्यान देना चाहिए संयुक्त राष्ट्र द्वारा आरंभ किया गया है, मैं प्रोटोटाइप का उपयोग कर रहा $ वहाँ आईडी विधि द्वारा प्राप्त)

+0

आप ' निश्चित रूप से उस सर्वर टैग के चारों ओर उद्धरण की आवश्यकता होगी। और मुझे नहीं लगता कि यह एक हैक क्यों है। यह एक वैध तकनीक है जिसे मैं हर समय उपयोग करता हूं। सर्वर टैग और क्लाइंट आईडी जैसी चीजें हैं। – harpo

+0

मुझे लगता है कि यह सिर्फ एक हैक जैसा लगता है क्योंकि यह गन्दा है। मैं नियंत्रण पर एक स्थिर, अनुमानित आईडी होना चाहूंगा कि जावास्क्रिप्ट –

+0

से बात कर सकता है, मैं हर समय इस दृष्टिकोण का भी उपयोग करता हूं। मैं आमतौर पर हेड टैग (स्टैंडअलोन पेजों पर) या एएसपी में अपने सभी "गतिशील" चर घोषित करता हूं: सामग्री नियंत्रण जो एएसपी को लिखता है: ContentPlaceHolder मास्टर के हेड टैग में। कम से कम एक ही स्थान पर गतिशील आईडी वाले सभी चर रखता है। –

4

आप .net नियंत्रण का विस्तार करने और उन्हें वास्तविक पहचान-पत्र वापस कर जब संबंधित गुणों कहा जाता है कर सकते हैं।

क्लाइंट आईडी आईडी विशेषता है और अद्वितीय आईडी HTML तत्वों का नाम विशेषता है। तो जब आप निम्न जैसे टेक्स्टबॉक्स बनाते हैं और फ्रेमवर्क में टेक्स्टबॉक्स के बजाय इसका उपयोग करते हैं, तो आप आईडी और नाम विशेषताओं को सर्वर-साइड आईडी के समान प्रस्तुत करते हैं।

public class MyTextBox : TextBox 
{ 
    public override string ClientID { get { return ID; } } 
    public override string UniqueID { get { return ID; } } 
} 

इस नए उपयोगकर्ता नियंत्रण का उपयोग करने के लिए, मूल रूप से इस पर नियंत्रण रजिस्टर के रूप में आप एक कस्टम उपयोगकर्ता नियंत्रण के लिए क्या करना होगा (आप कर सकते हैं web.config में है तो आप अपने सभी पृष्ठों में यह करने के लिए नहीं होगा) :

<%@ Register Assembly="MyLibrary" NameSpace="MyLibrary.WebControls" TagPrefix="MyPrefix" %> 

और इसका इस्तेमाल करते हैं, जैसे आप किसी पाठ बॉक्स का प्रयोग करेंगे:

<MyPrefix:MyTextBox ID="sampleTextBox" runat="server" /> 
+0

एक बात आप भी आवश्यकता होगी है, और एक .browser फ़ाइल –

12

एक विधि ओवरराइड करने के लिए है आईडी का मैन्युअल:

public override string UniqueID 
{ 
    get { return this.ID; } 
} 
public override string ClientID 
{ 
    get { return this.ID; } 
} 

Rick Strahl wrote a blog post पर कुछ और जानकारी के साथ वह दृष्टिकोण

7

एएसपी.नेट एमवीसी देखें - यह ओवर-मार ऑब्जेक्ट पदानुक्रमों को संबोधित करता है जो एएसपी.Net डिफ़ॉल्ट रूप से उत्पन्न करता है।

यह साइट एमवीसी (मुझे लगता है) में लिखा गया है - इसकी संरचना देखें। क्या मैं अभी एक नई परियोजना पर काम कर रहा हूं, मैं इसे पहले

यदि आप बुनियादी एएसपी.Net के साथ फंस गए हैं तो क्लाइंट आईडी और अनन्य आईडी को ओवरराइड करने से सावधान रहें - यह कई वेब नियंत्रण तोड़ने लगता है।

मुझे सबसे अच्छा तरीका पता चला है कि अपठनीय क्लाइंट आईडी को जावास्क्रिप्ट में पास करना है।

1

व्यक्तिगत रूप से, मैं सर्वर-साइड एएसपी.नेट "जादू" (मुझे अभी तक एमएस एमवीसी सामान का उपयोग करने के लिए अभी तक उपयोग नहीं किया गया है) और मेरे क्लाइंट-साइड कोड के मुंह के कारण विकसित किए गए तरीकों का एक सेट उपयोग करता हूं आईडी होती है।

public void RegisterControlClientID(Control control) 
{ 
    string variableDeclaration = string.Format("var {0} = \"{1}\";", control.ID, control.ClientID); 
    ClientScript.RegisterClientScriptBlock(GetType(), control.ID, variableDeclaration, true); 
} 

तो, अपने सर्वर-साइड कोड में आप बस इस फोन और एक नियंत्रण है जिसके लिए आप के लिए एक दोस्ताना नाम का उपयोग करना चाहते हैं उसका उदाहरण में पारित: यहाँ सिर्फ एक है कि हो सकता है या उपयोगी साबित नहीं हो सकता है। दूसरे शब्दों में, डिज़ाइन समय के दौरान, आपके पास "m_SomeTextBox" की आईडी वाला टेक्स्टबॉक्स हो सकता है और आप उसी नाम का उपयोग करके अपनी जावास्क्रिप्ट लिखने में सक्षम होना चाहते हैं - आप बस इस विधि को अपने सर्वर-साइड कोड में कॉल करेंगे:

RegisterControlClientID(m_SomeTextBox); 

और फिर ग्राहक निम्नलिखित पर प्रदान की गई है:

var m_SomeTextBox = "ctl00_m_ContentPlaceHolder_m_SomeTextBox"; 

इस तरह आपको अपना JavaScript कोड के सभी क्या ASP.NET चर नाम का फैसला करता है की काफी अज्ञानी हो सकता है। अनुमोदित, इस पर कुछ चेतावनियां हैं, जैसे कि जब आपके पास किसी पृष्ठ पर नियंत्रण के कई उदाहरण होते हैं (उपयोगकर्ता नियंत्रण के कई उदाहरणों का उपयोग करने के कारण, जिनमें सभी के पास m_SomeTextBox का उदाहरण है, उदाहरण के लिए), लेकिन आम तौर पर यह विधि हो सकती है अपनी सबसे बुनियादी जरूरतों के लिए उपयोगी हो।

1

मैं आमतौर पर जो करता हूं वह एक सामान्य कार्य बनाता है जो फ़ील्ड का नाम प्राप्त करता है। यह सामान्य "asp.net" उपसर्ग जोड़ता है और ऑब्जेक्ट देता है।

var elemPrefix = 'ctl00-ContentPlaceHolder-'; //replace the dashes for underscores 

var o = function(name) 
{  
    return document.getElementById(elemPrefix + name) 
} 

कि के साथ आप अपने पृष्ठ के तत्वों को लक्षित करके अपने निपटान jQuery

$(o('buttonId')).bind('click', function() { alert('hi); }); 
0

आप jQuery का उपयोग कर रहे हैं तो आप CSS selectors and jQuery custome selectors का भार है में कॉल इस तरह का उपयोग कर सकते हैं। तो बजाय चुनने की तुलना में एक सबमिट बटन यह आईडी है द्वारा, आप की तरह कुछ कर सकता है:

$('fieldset > input[type="submit"]').click(function() {...}); 
1

आप निश्चित रूप से करते हैं हार्ड-कोड नहीं करने के लिए asp.net उत्पन्न ID के अपने सीएसएस में चाहते हैं, क्योंकि यह बदल सकते हैं यदि आप अपने पृष्ठ पर चीजों को इस तरह से पुनर्व्यवस्थित करते हैं कि आपका नियंत्रण पेड़ बदल जाता है।

आप सही हैं कि सीएसएस आईडी की जगह है, इसलिए मैं कक्षाओं का उपयोग करने के लिए सुझावों को अनदेखा कर दूंगा।

यहां वर्णित विभिन्न जावास्क्रिप्ट हैक एक छोटी सी समस्या के लिए अधिक हैं। तो एक वर्ग से विरासत में है और आईडी संपत्ति को ओवरराइड कर रहा है। और एमवीसी में स्विच करने का सुझाव देना निश्चित रूप से सहायक नहीं है जब आप कुछ करना चाहते हैं तो कुछ सीएसएस को दोबारा दोहराएं।

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

<div id="DataGridContainer"> 
    <asp:datagrid runat=server id="DataGrid" > 
     ...... 
    <asp:datagrid> 
    </div> 
0

मैं देख सकता हूं कि .NET सिस्टम कम सहज महसूस करता है, लेकिन इसे एक मौका दें। मेरे अनुभव में यह वास्तव में क्लीनर कोड बनाने के समाप्त होता है। निश्चित

<asp:button id="ImAButton" runat="server">Click Me</asp:button> 

<script type="text/javascript"> 
var buttonId = <%=ImAButton.ClientId%> 
$(buttonId).bind('click', function() { alert('hi); }); 
</script> 

ठीक काम करता है। लेकिन यह मॉड्यूलर नहीं होने से पीड़ित है।जावा पक्ष या सी # ओर आप MakeAClick फोन पर अपने कोड के साथ बाद में

<script type="text/javascript"> 
function MakeAClick(inid) 
{ 
    $(inid).bind('click', function() { alert('hi); }); 
} 
</script> 

और उसके बाद: क्या आप वास्तव में चाहते हैं कुछ इस तरह है। निश्चित रूप से सी # पक्ष पर यह अधिक समझ में आता है, आप बस क्लाइंट आईडी में हैं।

शायद यह आपके द्वारा समीक्षा की जा रही कोड के साथ वास्तविक समस्या है।

0

क्लाइंट आईडीमोड का उपयोग करने और इसे static पर सेट करने के लिए एक बेहतर तरीका होगा। आप इसे web.config फ़ाइल में किसी विशिष्ट पृष्ठ या वैश्विक स्तर पर भी सेट कर सकते हैं। फिर आपको इस मुद्दे से फिर से निपटना पड़ेगा और आपका JQuery बहुत साफ है। पेज के

शीर्ष:

<%@ Page Title="" ClientIDMode="Static" Language="C#" CodeBehind="..." Inherits="WebApplication1.WebForm2" %> 

केवल नियंत्रण पर: लिस्टबॉक्स नियंत्रण के लिए एडेप्टर

<asp:Panel runat="server" ClientIDMode="Static"></asp:Panel> 
संबंधित मुद्दे