2009-08-21 120 views
11

我想構建一個用戶控件,假定爲MyDiv.ascx。 這個控件呈現div標籤,並且做一些諸如添加少量屬性等東西的代碼,這在這裏不是問題。 問題是我想要在用戶控件的開始和結束標記之間的文本。例如:用戶控制的開始和結束標記之間不允許有內容

本文帶有一些其他HTML標籤。

因此,當做這樣的事情時,我會在運行網站時出現解析錯誤。 另外,VS2008會提醒我「元素 MyDiv的開始和結束標記之間不允許有內容」。

  • 問題1:我可以這樣做的用戶控件的開 和結束標記之間的這種即文本/標記?

  • 問題2:如果是,如何

回答

13

我相信,你只需要幾個屬性適用於控制:

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

可能則需要重寫AddedControl - 我不知道。

這樣說吧 - 那是因爲我曾經寫過獨一無二的用戶控制:)

+0

哇...工作就像一個魅力... 但...可以üPLZ告訴我如何得到該內部的HTML,因爲我沒有得到這種屬性..像** this.InnerHtml或this.Children ** .. ??? – Manish 2009-08-24 06:23:29

+4

您可以使用[ParseChildren(true,「Body」)]和一個名爲字體類型爲「Body」的屬性。這會將InnerHtml的內容放入ParseChildren註釋中作爲第二個參數命名的任何屬性。 – 2010-10-20 22:43:41

0

添加一個文本屬性到您的控制,並在服務器,這將是打開和關閉的div之間的鏈接這一文本屬性爲標籤運行。

+0

這就是我不想做......我希望它表現得像正常的標籤... – Manish 2009-08-23 17:03:58

0

你可能要小心,如果你把一個服務器控件內容區域什麼工作.. 。

您可能只是想從面板繼承控件並覆蓋任何需要調整的方法?取決於您需要自定義的內容,可能會更容易或更困難

public class MyDiv : Panel 
{ 

} 
+0

我不能這樣做我猜... bcoz它已經繼承自UserControl類...所以將無法從其他類繼承...是他們的任何接口,我可以實現? – Manish 2009-08-23 17:06:13

17

建議的解決方案對我無效。我發現了以下解決方案: 要麼讓您的用戶控件繼承Panel而不是UserControl,或者如果您擁有多於一個的內容,請使您的內容字段爲PlaceHolder s而不是簡單的Control s。

添加了[PersistenceMode(PersistenceMode.InnerProperty)]以避免XHTML驗證警告。

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); 
    } 
} 

phBodyContentphGripContentPlaceHolder秒。

這樣我可以用我的控制裝置與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 2010-10-11 11:19:10

+0

我在答案中添加了更多詳細信息,以說明此解決方案的靈活性。當我必須將控件嵌入到具有其資源的程序集中時,才切換到CompositeControls,以便於分發。 – Mart 2010-10-11 17:45:04

+2

我在這裏建議的一個補充是在將它們添加到phBodyContent等之前也檢查新的PlaceHolder對象。當我指定了一些BodyContent時,它工作正常,但如果沒有,則會出錯。 – mattkgross 2017-10-09 22:57:43

4

我也想創建「innerHTML的」自定義控制。這是我結束了(部分基於一些早期的答案/評論)...

div.ascx.cs:

[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> 

測試頁:

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

+1完整語法 – 2011-05-10 17:20:56

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

如果包含有效的語法/代碼,則答案更有用。 – 2012-06-10 16:10:52

相關問題