在asp.net UserControl上公开嵌套的HTML属性

时间:2012-06-26 15:30:27

标签: asp.net user-controls

我有一个asp.net UserControl,它将HTML内容从SharePoint列表写入Literal控件。目前,我在写入Literal的每个SharePoint列表项之前在h5标记中插入标题。我没有将标题硬编码放在h5标签中,而是希望公开我的用户控件的公共属性,让我可以定义标题的html格式。这与我发现的模板化用户控件问题有点不同,因为它不是用户控件的模板。我只需要一个包含html的字符串。这就是我要做的事情:

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>

我该如何设置?

2 个答案:

答案 0 :(得分:2)

以下是答案(由Decker Dong在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 :(得分:-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>

Codebehind - 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标记了。