2009-04-03 14 views
5

क्या नियंत्रण को "स्थानांतरित करने" का एक स्वीकार्य तरीका है।आप रनटाइम पर वेब फ़ॉर्म पर विभिन्न स्थानों पर ASP.Net नियंत्रण कैसे ले जा सकते हैं?

मेरा ग्राहक पृष्ठ पर कई अलग-अलग स्थानों में से एक में मार्कअप का एक निश्चित हिस्सा (कुछ दृश्य तत्व का प्रतिनिधित्व करना) चाहता है। स्थान इस बिंदु से अलग हैं कि मैं सीएसएस पर परिवर्तन को प्रभावित नहीं कर सकता (इसे फ़्लोट करके या कुछ)।

मैंने दृश्यमान सेट के साथ "झूठी" के साथ कई स्थानों पर नियंत्रण डालने पर विचार किया, फिर उस स्थान को उस स्थान पर प्रदर्शित किया जहां वे उस विशेष पृष्ठ के लिए चाहते थे।

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

तो, मैं इसे वेब फॉर्म पर एक ही स्थान पर रखना चाहता हूं, जहां मैं इसे चाहता हूं उसके आधार पर इसे चारों ओर ले जाना चाहता हूं। क्या मैं प्लेसहोल्डर को विभिन्न स्थानों पर रख सकता हूं, एक स्थान पर नियंत्रण रख सकता हूं, फिर उसे हटाकर सही जगह पर जोड़ सकता हूं? मुझे संदेह है कि यह काम करेगा।

क्या किसी के पास कोई बेहतर विचार है? क्या इसके लिए कोई अच्छा अभ्यास है?

उत्तर

5

मैं, एक प्लेसहोल्डर नियंत्रण का उपयोग करने के लिए एक अलग उपयोगकर्ता नियंत्रण में अपने मार्कअप चलती है, तो क्रम में इस लोड हो रहा है और प्रासंगिक प्लेसहोल्डर में जोड़ने की सलाह देते हैं।

ईजी।

// Load a user control 
MyControl userCtrl = (MyControl) LoadControl("~/Controls/MyControl.ascx"); 

// Or create an instance of your control 
SubclassedControl subclassedCtrl = new SubclassedControl(); 

// Do stuff with controls here 
userCtrl.LoadData(); 
subclassedCtrl.Text = "Hello World"; 

// Check which placeholder to add controls to 
PlaceHolder placeHolder = (foo=="bar") ? placeHolder1 : placeHolder2; 

// Add the controls 
placeHolder.Controls.Add(userCtrl); 
placeHolder.Controls.Add(subclassedCtrl); 

यह अनावश्यक मार्कअप के साथ अपने पृष्ठ को अव्यवस्थित से बचने जाएगा, और कार्यावधि में यह लोड हो रहा है भी बाद में अनावश्यक भ्रम से बचने जाएगा, जब एक और डेवलपर कोड को देखता है और तुरंत देख नहीं क्यों एक नियंत्रण एक ही स्थान पर है मार्कअप में, लेकिन पृष्ठ के एक पूरी तरह से अलग भाग पर प्रस्तुत करता है।

+0

यदि नियंत्रण मानक ASP.Net नियंत्रण का विस्तार है, तो मैं यह कैसे करूँगा, इसलिए यह App_Code में .cs फ़ाइल के रूप में मौजूद है? क्या मुझे इसे उपयोगकर्ता नियंत्रण (ए .ascx फ़ाइल) में "लपेटना" चाहिए? – Deane

+0

हां, तो आप इसे प्लेसहोल्डर या पैनल में लोड कर सकते हैं .. एक ही अंतर, केवल पैनल एक div या span टैग थूकता है जहां प्लेसहोल्डर नहीं करता है। – madcolor

+0

यदि आप एक मानक एएसपी.NET नियंत्रण को उपclassing कर रहे हैं, तो नियंत्रण लोड करने के बजाय, आप इसके बजाय अपने नियंत्रण का एक उदाहरण बना सकते हैं, और फिर इसे प्लेसहोल्डर में जोड़ सकते हैं। मैंने इसे प्रतिबिंबित करने के लिए उपरोक्त कोड नमूना अपडेट किया है। – Mun

2

क्या वेब पार्ट्स आप जो करना चाहते हैं?

या, आप अपने नियंत्रण के माता-पिता को एक अलग क्षेत्र में स्थानांतरित करने के लिए प्रोग्रामेटिक रूप से बदल सकते हैं।

0

आप हमेशा पूर्व-निर्धारित स्थानों में पैनल डाल सकते हैं और रनटाइम पर विशिष्ट पैनल में नियंत्रण जोड़ सकते हैं .. यहां एक लेबल जोड़ने का एक उदाहरण है (लेबल को किसी भी नियंत्रण से बदला जा सकता है)।

Dim lblDisplay As Label = New Label() 
lblDisplay.ID = "myLabel" 
lblDisplay.Text = "Some Text" 
pnlDisplay.Controls.Add(lblDisplay) 

जहां तक ​​...

"इसके अलावा, मैं नहीं चाहता कि इसी कारण से कोड-पीछे सख्ती से इस पर नियंत्रण के साथ काम करने के लिए करना चाहते हैं।"

मुझे लगता है कि आपको कोड के पीछे अपना अधिकांश काम करना होगा।

पी एस .. पूरे usercontrol सेटअप का एक अच्छा उदाहरण यहाँ डाउनलोड किया जा सकता है .. http://www.asp.net/downloads/starter-kits/time-tracker/

+0

मेरा मतलब था कि मैं इसे कोड-पीछे से नहीं बनाना चाहता था। मुझे कोड के पीछे से किसी रूप में इसे मैनिपुलेट करने में कोई समस्या नहीं है, लेकिन मुझे वेब फॉर्म में इसका बड़ा हिस्सा चाहिए। – Deane

+0

मैं सुझाव दे रहा हूं कि आप मार्कअप के साथ उपयोगकर्ता-नियंत्रण बनाएं जिसमें आपके पास प्राप्त/सेट और पैनल लोड हो सकें। आपके मार्कअप को वेबफॉर्म में बैठने का कोई अच्छा कारण नहीं है जिसे मैं देख सकता हूं। – madcolor

1

आप विधि प्रस्तुत ओवरराइड और नियंत्रण जगह भी आप html में चाहते हैं कर सकते हैं।

आपको केवल नियंत्रण संग्रह में नियंत्रण जोड़ने की आवश्यकता है जो सर्वर पर बातचीत करनी चाहिए। आपका बाकी HTML केवल प्रतिक्रिया स्ट्रीम में लिखा जा सकता है। यदि आप रेंडर ओवरराइड करते हैं तो आप एचटीएमएल बना सकते हैं, फिर भी आप फिट देखते हैं, किसी भी क्रम में नियंत्रण रख सकते हैं।

नीचे आपका HTML लिखने का एक उदाहरण है।

protected override void Render(HtmlTextWriter writer) 
{ 
    AddAttributesToRender(writer); 
    writer.RenderBeginTag(TagKey); 

    writer.RenderBeginTag(HtmlTextWriterTag.Div); 
    _control.RenderControl(writer); 
    writer.RenderEndTag(); 

    writer.RenderEndTag(); 
} 
3

एक विकल्प (और मैंने पहले कई बार देखा है) जावास्क्रिप्ट और डोम के माध्यम से है। एक छिपे हुए div टैग के अंदर अपना नियंत्रण प्रस्तुत करें। तो आप अपनी सामग्री यहाँ प्रस्तुत करना होगा:

<div id='rendercontent' style='display:none'> 
    .. control here .. 
</div> 

फिर, मान लीजिए कि आपने यह सब यहाँ जाना चाहते थे (स्पैन टैग के अंदर है, क्योंकि हम क्या बदलने के लिए जा रहे हैं कि):

<div id='newlocation1'><span></span></div> 

आप नीचे दिए गए जावास्क्रिप्ट निर्धारित करना होगा:

<script language="JavaScript"> 
function replaceNode(newElementID, targetElementID) 
{ 
    var targetElement=document.getElementById(targetElementID); 
    var newElement=document.getElementById(newElementID); 
    targetElement.replaceChild(newElement, targetElement.firstChild); 
} 
</script> 

और जब आप नए स्थान पर सामग्री ले जाना चाहते हैं, फोन:

<script language="JavaScript"> 
replaceNode('rendercontent','newlocation1'); 
</script> 
संबंधित मुद्दे