3

我有一个 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>

我该如何设置?

4

2 回答 2

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)
    {

    }
}

使用这些属性,您可以使用问题中所写的控件。

于 2012-06-28T16:39:38.123 回答
-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标签了。

于 2012-06-26T17:24:27.967 回答