用户控件声明中的类似xml的属性

时间:2010-09-10 09:31:00

标签: c# asp.net user-controls properties

我创建了一个用户控件,它从XML文件中获取内容并在页面上呈现内容。相当直接的东西。

然而,我可能需要将基于id的部分内容替换为其他手册内容。

我的想法是在用户控件的声明中公开一个可重复的属性,如下所示:

<my:XmlRenderSource ID="XmlRenderSource1" runat="server" XmlUrl="xml/sample.xml">
    <OverrideContent targetId='thingToReplaceId'><p>New Content</p></OverrideContent>
    <OverrideContent  targetId='thingToReplaceId2'><p>New Content</p></OverrideContent>
</my:XmlRenderSource>

到目前为止,我的userControl中有以下内容(我已经删除了无用的东西):

 public class OverrideContent
    {
        public string targetId { get; set; }
    }

    public class OverrideContentCollection : List<OverrideContent>
    {

    }


[
      ParseChildren(
  typeof(OverrideContent),
  DefaultProperty = "OverrideItems",
  ChildrenAsProperties = true
  )
  ]
public partial class XmlRenderSource : System.Web.UI.UserControl
    {
        private string xmlUrl = "";
        private string xmlUrlBase = "";

          public OverrideContentCollection OverrideItems
          {
          get;
          set;
          }
// Loads of other code that doesn't matter for this
}

在加载或预渲染的情况下,我遍历OverrideContent项并在渲染之前替换部分xml。我理解如何做到这一点,但我有一个明显的问题,将OverrideContent项目暴露为可重复的属性。

我知道可以做到,但对于我的生活,我无法做到。如果有人能提供关于如何做到这一点的速成课程,我会永远感激。

1 个答案:

答案 0 :(得分:1)

你可以试试这样的东西:

[ParseChildren(typeof(OverrideContent), DefaultProperty = "OverrideItems", ChildrenAsProperties=true)]
public partial class XmlRenderSource : System.Web.UI.UserControl
{
    private OverrideContentCollection overrideItems = new OverrideContentCollection();

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
    public OverrideContentCollection OverrideItems
    {
        get { return overrideItems; }
    }
}

我使用此页面作为测试:

<%@ Register Src="XmlRenderSource.ascx" TagName="XmlRenderSource" TagPrefix="uc1" %>
<%@ Register Namespace="WebApplication2" TagPrefix="uc1" Assembly="WebApplication2" %>
...

<uc1:XmlRenderSource ID="XmlRenderSource1" runat="server">
    <uc1:OverrideContent targetId="test">Content</uc1:OverrideContent>
    <uc1:OverrideContent targetId="test2" />
</uc1:XmlRenderSource>

编辑: 如果你需要在每个OverrideElement中加入一些文本,这是一种方法(我还更新了上面的测试页):

[ParseChildren(true, "text")]
public class OverrideContent
{
    public string targetId { get; set; }

    [PersistenceMode(PersistenceMode.EncodedInnerDefaultProperty)]
    public string text { get; set; }
}