我创建了一个用户控件,它从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项目暴露为可重复的属性。
我知道可以做到,但对于我的生活,我无法做到。如果有人能提供关于如何做到这一点的速成课程,我会永远感激。
答案 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; }
}