2009-10-29 12 views
5

के अंदर उपयोगकर्ता नियंत्रण पर गुणों को सेट करना मेरे पास एक उपयोगकर्ता नियंत्रण है जिसे मैं किसी ऑब्जेक्ट के बारे में जानकारी दिखाने के लिए एकाधिक पृष्ठों पर उपयोग करता हूं। जब भी मुझे इस उपयोगकर्ता नियंत्रण का उपयोग करने की आवश्यकता होती है, तो मैं डिस्प्ले (उपयोगकर्ता नियंत्रण पर) नामक एक विधि को कॉल करता हूं और कुछ मानों में पास करता हूं।फ़ोरैच लूप

public void Display(string name, List<Items> items) 
{ 
    // Set a few protected properties so I can display values from the aspx page 
} 

यह ठीक काम करता है, लेकिन अब मुझे एएसपीएक्स पेज में फ़ोरैच लूप के अंदर इस नियंत्रण का उपयोग करने की आवश्यकता है।

<% foreach (var c in Categories) { %> 
     <uc:ItemsControl runat="server"/> 
<% } %> 

श्रेणियों के ऑब्जेक्ट में विधियों और गुण हैं जिन्हें मैं अन्यथा प्रदर्शन विधि में पास करूंगा। तो मैं मूल्यों को सही तरीके से कैसे सेट करूं?

मैं उपयोगकर्ता नियंत्रण सार्वजनिक पर गुण बनाने की कोशिश की और सिर्फ उन्हें इस तरह से की स्थापना:

<uc:ItemsControl Items="<%# c.Items %>" 
       OtherProperty="<%# c.GetProperty() %>" 
       runat="server"/> 

यह काम नहीं करता है, क्योंकि गुण में भेजा जा रहा है खाली हैं। अगर मैं <% = का उपयोग करता हूं तो यह काम नहीं करता है और वास्तव में एक त्रुटि फेंकता है क्योंकि यह 'सी' नहीं पहचानता है (जब तक मैं runat = "server" नहीं लेता तब यह कम से कम संकलित होगा, फिर भी यह काम नहीं करेगा ।

क्या यह करने के लिए उचित तरीका है

संपादित करें:?। इसके अलावा, एक पुनरावर्तक नियंत्रण डेटा बाइंडिंग के लिए इस आसान बना सकता है, लेकिन मैं किसी भी नेट नियंत्रणों के उपयोग से बचने के लिए पसंद करते हैं

उत्तर

0

Justin Grant's answer संभावना काम किया हवलदार करेंगे ठीक है, हम बस उपयोगकर्ता नियंत्रण लोड हो रहा है और DisplayResults विधि बुला के साथ जाने का फैसला किया।

<% ((UserControlType)LoadControl("~/pathToUserControl.ascx")) 
     .DisplayResults(ItemName, ItemList)); %> 

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

10

वेबफॉर्म पेज में, जिस तरह से इसे आमतौर पर डेटाबाइंडिंग का उपयोग करके संभाला जाता है। फ़ोरैच लूप के बजाय, आप Repeater नियंत्रण का उपयोग कर सकते हैं, इसकी डेटासोर्स प्रॉपर्टी को <%#Categories%> पर सेट कर सकते हैं और फिर अपने लेटे में डेटा-बाइंडिंग सिंटैक्स का उपयोग कर सकते हैं ऊपर उदाहरण उदाहरण, c के बजाय, आपको अपने नियंत्रण में उचित प्रकार के लिए Container.DataItem डालना होगा। इस तरह:

<%@ Page Language="C#" %> 
<script runat="server"> 
protected void Page_Load(object sender, EventArgs e) 
{ 
    CategoriesList.DataBind(); 
} 
class Category 
{ 
    public string CategoryName { get; set; } 
    public string GetProperty() { return CategoryName; } 
    public string[] Items { get { return new string[] {CategoryName + " 1", CategoryName + " 2"}; } } 
} 
Category[] Categories = new Category[] 
{ 
    new Category { CategoryName = "Shorts" }, 
    new Category { CategoryName = "Socks" }, 
    new Category { CategoryName = "Shirts" }, 
}; 
</script> 
<html> 
<body> 
<asp:Repeater runat="server" ID="CategoriesList" DataSource="<%# Categories %>"> 
    <ItemTemplate> 
    <uc:ItemsControl 
     Items="<%# ((Category)(Container.DataItem)).Items %>" 
     OtherProperty="<%# ((Category)(Container.DataItem)).GetProperty() %>" 
     runat="server"/> 
    </ItemTemplate>  
</asp:Repeater> 
</body> 
</html> 

केवल चेतावनी आप पुनरावर्तक की विधि DataBind() somwhere कॉल करने के लिए, आम तौर पर Page_Load विधि में की आवश्यकता होगी है।

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

Btw, अपने दृष्टिकोण से ऊपर काम नहीं किया है क्योंकि:

  1. runat = सर्वर ASP.NET नियंत्रण गुण <%= %> का उपयोग कर भरा नहीं जा सकता syntax-- कि सादे-पाठ उत्पादन के लिए ही उपयोगी है, है ना ऑब्जेक्ट गुणों में भरने के लिए।

  2. डेटा-बाइंडिंग वाक्य रचना (<%# %>) का उपयोग कर निश्चित रूप से नियंत्रण गुण में को भरने के लिए इस्तेमाल किया जा सकता है, लेकिन आप जरूरत है (एक पुनरावर्तक की तरह) एक डेटा-बाइंडिंग कंटेनर में नियंत्रण लपेटो और DataBind कॉल करने के लिए() होने के लिए प्रतिस्थापन प्राप्त करने के लिए।

+1

एक पुनरावर्तक शायद उचित तरीका होगा, लेकिन हम जहां भी संभव हो .NET नियंत्रणों के उपयोग से बचने की कोशिश करते हैं और एचटीएमएल उत्पन्न करने के साथ जाना पसंद करते हैं। – Brandon

+0

हाँ, मैं भी - मुझे लूप-एंड-एमिट-एचटीएमएल दृष्टिकोण भी अधिक सरल लगता है। यही कारण है कि मुझे एएसपी.नेट एमवीसी पसंद है। लेकिन वेब प्रपत्रों के साथ, यदि आप पहले से ही अपने स्वयं के कस्टम नियंत्रणों का उपयोग कर रहे हैं और विशेष रूप से लूप में, अपनी बाध्यता में डेटा को बाध्य करने की आवश्यकता है, तो जाने के लिए सबसे आसान तरीका है। जिज्ञासा से, एएसपीनेट के अंतर्निर्मित नियंत्रणों से क्यों बचें? क्या यह एक प्रदर्शन से संबंधित चिंता है या कुछ और? दोहराना नियंत्रण * बहुत * नंगे हड्डियों और तेज़ है - और इस तरह कोई व्यूस्टेट या अन्य क्रूड का कारण बनता है। पुनरावर्तक एक फोरैच पाश की तरह नियंत्रण के रूप में कार्य कर सकता है। –

+0

यह एक स्थिरता/प्रदर्शन चिंता का अधिक है। मेरा मालिक मूल रूप से प्रोजेक्ट में .NET नियंत्रण रखने से दूर चले गए क्योंकि नियंत्रण/अजाक्सटूलकिट हमें जो चाहिए था उसके लिए बहुत भारी था, इसलिए एक शुद्ध HTML/jQuery दृष्टिकोण लिया गया था। अगर सब कुछ विफल हो जाता है तो मैं एक ही दोहराने में फेंक सकता हूं, मैं बस सोच रहा था कि क्या हम जिस मार्ग को पहले ही शुरू कर चुके हैं उसका उपयोग करके ऐसा करने का कोई तरीका था। – Brandon

1

मुझे पता है कि यह पुराना है, लेकिन मुझे यह थ्रेड Google के माध्यम से तुरंत मिला है इसलिए मैं इसे टाइप करूंगा।

मैंने अभी देखा है कि एक सहकर्मी की मदद करते हुए आप इसे उपयोगकर्ता नियंत्रण के साथ ऐसा कर सकते हैं। ध्यान दें कि मैंने केवल अपने उदाहरण के माध्यम से इसका परीक्षण किया है।

<% foreach (var c in Categories) { %> 
     <uc:ItemsControl runat="server" ID="ucItem"/> 
<% 
ucItem.PropertyToChange = c.Property; 
} %> 

यदि यह आपके लिए लागू नहीं है तो यह दूसरों के लिए हो सकता है।

+1

नियंत्रण को कॉल करने से पहले आपको संपत्ति सेट करने की आवश्यकता है। लेकिन अन्यथा, आसान है अगर यह लूप में इस्तेमाल किए गए नियंत्रण के एक उदाहरण का एक साधारण मामला है। – Reuben

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