2009-08-21 9 views
11

मैं उपयोगकर्ता नियंत्रण का निर्माण करना चाहता हूं MyDiv.ascx। यह नियंत्रण div टैग को प्रस्तुत करता है और कुछ विशेषताओं को जोड़ने जैसे सामान के पीछे कुछ और कोड करता है जो यहां चिंता का विषय नहीं है। समस्या यह है कि मैं उपयोगकर्ता नियंत्रण के उद्घाटन और समापन टैग के बीच पाठ चाहता हूं। उदाहरण:उपयोगकर्ता नियंत्रण के लिए उद्घाटन और समापन टैग के बीच सामग्री की अनुमति नहीं है

पाठ कुछ अन्य HTML टैग के साथ यहां जाता है।

तो ऐसा कुछ करने पर मुझे वेबसाइट चलाने के दौरान एक पार्सिंग त्रुटि मिलती है। इसके अलावा VS2008 मुझे यह कहते हुए चेतावनी देता है कि "तत्व MyDiv" के लिए उद्घाटन और समापन टैग के बीच सामग्री की अनुमति नहीं है।

  • प्रश्न 1: मैं उद्घाटन और एक उपयोगकर्ता नियंत्रण के समापन टैग के बीच इस अर्थात पाठ/मार्कअप की तरह कुछ कर सकता हूँ?

  • प्रश्न 2: यदि हां, तो कैसे

उत्तर

13

मैं आपको लगता है कि बस को नियंत्रित करने के गुण के एक जोड़े को लागू करने की जरूरत है:

[ParseChildren(false)] 
[PersistChildren(true)] 
public class MyDiv : UserControl 
{ 
    ... 

आप हो सकता है तो AddedControl ओवरराइड करने के लिए की जरूरत है - मुझे यकीन है कि नहीं हूँ।

यह इस तरह से रख - कि क्या एक और केवल उपयोगकर्ता नियंत्रण मैंने कभी लिखा है :)

+0

वाह ... जो एक आकर्षण की तरह काम करता है ... लेकिन ... क्या आप मुझे बता सकते हैं कि मैं उस आंतरिक एचटीएमएल को कैसे प्राप्त कर सकता हूं क्योंकि मुझे इस तरह की संपत्ति नहीं मिल रही है ... यह। इनर एचटीएमएल या यह। बच्चे ** .. ??? – Manish

+4

आप [पर्स चिल्ड्रेन (सच्चा, "बॉडी")] का उपयोग कर सकते हैं जिसे "बॉडी" टाइप स्ट्रिंग नामक संपत्ति के साथ उपयोग किया जा सकता है। यह InnerHtml की सामग्री रखेगा और इसे ParseChildren एनोटेशन में आपके दूसरे तर्क के रूप में नामित किसी भी संपत्ति में डाल देगा। –

0

एक पाठ संपत्ति अपने नियंत्रण में जोड़े और सर्वर है कि उद्घाटन और समापन div के बीच हो जाएगा पर एक लेबल चलाने के लिए इस पाठ संपत्ति जुड़े।

+0

है यही कारण है कि मुझे क्या करना नहीं चाहते हैं क्या ... मैं इसे की तरह व्यवहार करना चाहते हैं सामान्य टैग ... – Manish

0

आपको सावधान रहना चाहती है, क्या हुआ अगर आप सामग्री क्षेत्र में एक सर्वर नियंत्रण रखा के लिए काम करता है ..

आप केवल एक पैनल से नियंत्रण प्राप्त करना चाहते हैं और समायोजित करने के लिए आवश्यक किसी भी तरीके को ओवरराइड करना चाहते हैं? आसान या कठिन क्या तुम मेरे लिए काम नहीं किया

public class MyDiv : Panel 
{ 

} 
+0

मैं यह नहीं कर सकता मुझे लगता है ... bcoz यह पहले से ही UserControl क्लास से विरासत में है ... इसलिए अन्य वर्ग से उत्तराधिकारी नहीं हो पाएगा ... क्या उनका कोई इंटरफ़ेस मैं कार्यान्वित कर सकता हूं ??? – Manish

17

सुझाव दिया समाधान अनुकूलित करने के लिए की जरूरत पर निर्भर करता है हो सकता है। मुझे निम्नलिखित समाधान मिल गए: या तो अपने उपयोगकर्ता नियंत्रण कोसे केवल UserControl के बजाय प्राप्त करें, या यदि आपके मामले में एक से अधिक सामग्री हैं, तो अपने सामग्री फ़ील्ड PlaceHolder एस को सरल Control एस के बजाय बनाएं।

[PersistenceMode(PersistenceMode.InnerProperty)] एक्सएचटीएमएल सत्यापन चेतावनी से बचने के लिए जोड़ा गया है।

public partial class DrawerControl : UserControl 
{ 
    [PersistenceMode(PersistenceMode.InnerProperty)] 
    public PlaceHolder BodyContent { get; set; } 
    [PersistenceMode(PersistenceMode.InnerProperty)] 
    public PlaceHolder GripContent { get; set; } 

    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     phBodyContent.Controls.Add(BodyContent); 
     phGripContent.Controls.Add(GripContent); 
    } 
} 

phBodyContent और phGripContent जा रहा है PlaceHolder रों।

इस तरह से मैं ASPX में किसी भी सामग्री के साथ अपने नियंत्रण का उपयोग कर सकते हैं:

<local:Drawer ID="ctlDrawer" runat="server"> 
    <BodyContent> 
     <!--Insert any ASP content here--> 
    </BodyContent> 
    <GripContent> 
     <!--Insert any ASP content here--> 
    </GripContent> 
</local:Drawer> 
+0

एक समग्र नियंत्रण के लिए जा रहा है (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.compositecontrol.aspx) आपके मामले में एक अच्छा समाधान। आप मार्ट क्या कहते हैं? – Manish

+0

मैंने इस समाधान की लचीलापन को चित्रित करने के लिए मेरे उत्तर में अधिक जानकारी दी। जब मैं एक आसान वितरण के लिए अपने संसाधनों के साथ असेंबली में नियंत्रण एम्बेड करना चाहता हूं तो मैं कंपोजिट कंट्रोल पर स्विच करता हूं। – Mart

+2

एक अतिरिक्त मैं यहां सुझाव देना चाहता हूं कि उन्हें नई प्लेसहोल्डर ऑब्जेक्ट्स को phBodyContent, आदि में जोड़ने से पहले भी जांचना है। जब मैंने कुछ बॉडीकंटेंट निर्दिष्ट किया तो यह मेरे लिए ठीक काम करता था, लेकिन अगर मैंने नहीं किया तो त्रुटि होगी। पूर्ण वाक्यविन्यास – mattkgross

4

मैं भी "innerHTML" के साथ एक कस्टम नियंत्रण बनाना चाहता था।

[ParseChildren(true, "Text")] //Store inner content in Text property 
public partial class div : System.Web.UI.UserControl 
{ 
    public string Text { get; set; } 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     litText.Text = Text; //Render it however you want 
    } 
} 

div.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="div.ascx.cs" Inherits="TestApp.Controls.div" %> 
<div> 
    <asp:Literal ID="litText" runat="server" /> 
</div> 

यह है कि मैं क्या साथ (पहले जवाब/टिप्पणियों में से कुछ पर आंशिक रूप से आधारित) ...

div.ascx.cs समाप्त हो गया है टेस्ट पेज:

<%@ register src="~/Controls/div.ascx" tagname="div" tagprefix="uc" %> 
<uc:div ID="div1" runat="server">Test data</uc:div> 
+0

+1 यदि वे वैध वाक्यविन्यास/कोड रखते हैं तो उत्तर अधिक उपयोगी होते हैं। –

2

मैं इस यहाँ पर पाया:

ASP.Net: User control with content area, it's clearly possible but I need some details

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

[ParseChildren(true, "Content")] 

[PersistChildren(false)] 

public partial class CollapsiblePanelControl : UserControl 

{ 

    private Control content; 

    // add the content 
    this.MainContent.Controls.Add(content); 

    // if this is not a post back 
    if (!this.IsPostBack) 
    { 
     // set to true; 
     this.Expanded = true; 
    } 
} 

मार्कअप इस तरह है:

<asp:Panel ID="CollapsiblePanelMainPanel" runat="server" CssClass="collapsiblepanel"> 
    <asp:Panel ID="CollapsibleHeaderPanel" runat="server" CssClass="collapsibleheaderpanel"> 
     <asp:ImageButton ID="CollapseButton" ImageUrl="~/Images/BlueArrowDown.png" runat="server" OnClick="ExpandButton_Click" CssClass="expandbutton" /> 
     <asp:Label ID="CollapsiblePanelHeaderLabel" runat="server" Text="Collapsed" CssClass="collapsiblelabel"></asp:Label> 
    </asp:Panel> 
    <asp:Panel ID="MainContent" runat="server"> 
    </asp:Panel> 
</asp:Panel> 

और फिर ग्राहक में:

<dc:CollapsiblePanelControl ID="CheckOnMePanel" runat="server" CssClass="checkonmepanel" EnableViewState="true" 
     CollapsedHeight="20px" ExpandedHeight="300px" Expanded="true" HeaderText="Check On Me Email Service" > 
    <Content> 
     ...[Your Content Goes Here] 
    </Content> 
</dc:CollapsiblePanelControl> 
+1

के लिए –

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