2010-09-10 46 views
1

我創建了一個用戶控件,它從XML文件獲取內容並呈現頁面上的內容。相當直接的東西。用戶控件聲明中類似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> 

到目前爲止,我已經在我的用戶控件(我已經削減了無用的東西)以下:

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

您可以用類似的東西嘗試:

[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; } 
} 
+0

這接近我所需要的,但然後我需要能夠將內容添加到OverrideContent對象的中間。到目前爲止,我讀過的所有內容都不允許在usercontrols之間放置內容,所以我認爲我需要創建一個自定義控件,儘管我將它添加到彙編列表中,但仍未顯示。如果可以告訴我如何獲取這些控件的innerHTML,這正是我所需要的。 – cdutson 2010-09-13 12:33:21

+0

我不明白你的意思是「在usercontrols之間放置內容」。你想在OverrideContent元素之間添加純文本嗎?或OverrideContent元素的開始和結束標記之間的純文本? – 2010-09-13 12:59:32

+0

參考我最初的例子,看看我的意思。基本上,用戶控件中的所有內容打開和關閉標記,我想存儲,但不呈現。然後,我想使用該存儲的信息來替換XML文檔中的內容。我知道如何做實際的替換,但它是我無法弄清的usercontrol標籤之間的內容。 – cdutson 2010-09-13 13:08:26