2012-06-26 26 views
2

我有一個asp.net用戶控件,可以將HTML內容從SharePoint列表寫入文字控件。目前,我在寫入Literal的每個SharePoint列表項之前在h5標記中插入一個標題。我不想將標題硬編碼放置在h5標籤中,而是希望公開我的用戶控件的公共屬性,使我可以爲標題定義html格式。這與我發現如此之多的模板化用戶控件問題有點不同,因爲它不是用戶控件的真正模板。我只需要一個包含html的字符串。以下是我在找什麼做的事:在asp.net上公開嵌套的HTML屬性UserControl

public class MyUserControl: UserControl 
{ 
    public string TitleFormat { get; set; } 

    private void ShowContent() 
    { 
     ... 
     string output = String.Format(TitleFormat, title) + someContent; 
     ltlOutput.Text = output. 
    } 
} 

在標記:

<UC:MyUserControl id="muc1" runat="server"> 
    <TitleFormat> 
     <a href="www.somewhere.com"><h3>{0}</h3></a> 
    </TitleFormat> 
</UC:MyUserControl> 

我如何設置呢?

回答

1

下面是答案(由德克爾董在asp.net論壇提供):

要嵌套另一個類爲一體,你要聲明一個新的屬性,但 只是聲明它是一個InnerProperty。並設置其設計屬性。 現在,這裏是一個完整的樣品給你:

[ParseChildren(true),PersistChildren(false)] 
public partial class MyUserControl : System.Web.UI.UserControl 
{ 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    [PersistenceMode(PersistenceMode.InnerProperty)] 
    public string TitleFormat 
    { 
     get; 
     set; 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
} 

有了這些屬性,你可以用寫在問題的控制。

-1

你需要的是http://msdn.microsoft.com/en-us/library/system.web.ui.itemplate.aspx

HTML

<test:NamingControl runat="server" ID="NamingControl" TitleFormat="This is myTitle"> 
    <TitleFormatTemplate> 
     My title is <%# Container.TitleFormat %> 
    </TitleFormatTemplate> 
</test:NamingControl> 

用戶控件

public partial class MyUserControl : System.Web.UI.UserControl 
{ 
    private ITemplate template; 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    public string TitleFormat 
    { 
     get; 
     set; 
    } 

    [PersistenceMode(PersistenceMode.InnerProperty), 
    TemplateContainer(typeof(TitleFormatTemplate))] 
    public ITemplate TitleFormatTemplate 
    { 
     get { return template; } 
     set { template = value; } 
    } 

    protected override void CreateChildControls() 
    { 
     base.CreateChildControls(); 

     TitleFormatTemplate t = new TitleFormatTemplate(); 
     t.TitleFormat = this.TitleFormat; 
     template.InstantiateIn(t); 
     this.Controls.Add(t); 
     this.DataBind(); 
    } 
} 

子控件 - 作INamingContainer

public class TitleFormatTemplate : Control, INamingContainer 
{ 
    private string _TitleFormat = ""; 
    public string TitleFormat 
    { 
     get { return _TitleFormat; } 
     set { _TitleFormat = value; } 
    } 
} 

的更簡單的方法 - 沒有更多TitleFormat標籤

MyUserControl.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyUserControl.ascx.cs"  
    Inherits="testgingweb.usrcontrols.MyUserControl" %> 

<a href="www.somewhere.com"><h3><asp:Label runat="server" ID="PassedValueLabel"></asp:Label</h3></a> 

代碼隱藏 - MyUserControl.ascx.cs

public string TitleFormat 
{ 
    get { return ViewState["TitleFormat"]; } 
    set { ViewState["TitleFormat"] = value; } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    PassedValueLabel.Text = String.Format("Whatever {0} here", this.TitleFormat); 
} 

HTML

<test:MyUserContorl runat="server" ID="NamingControl" TitleFormat="This is myTitle"> 
</test:MyUserContorl> 

請注意,我沒有TitleFormat標籤了。

+0

首先,感謝您的回答。我不認爲這會適用於我正在做的事情。你有點重新定義了我的目標。我將插入一個動態數量的標題,所以我不能爲每個標題添加一個屬性。我並不需要ITemplate或任何在控件中實例化的東西。這將是矯枉過正。我只想在標記中聲明一個字符串屬性作爲用戶控件的子元素。字符串屬性的值恰好是HTML。你是說不能做? – xr280xr

+0

您用作控件的子元素的標記''只能用於ITemplate。沒有這一點,你不能以聲明的方式去做。檢查我更新的答案以查看其他方法 – codingbiz

+0

「您用作控件的子元素的標記只能使用ITemplate」 - False。看到明顯的答案。 – xr280xr