xml-подобные свойства в объявлении пользовательского элемента управления - PullRequest
1 голос
/ 10 сентября 2010

Я создал пользовательский элемент управления, который берет содержимое из файла XML и отображает содержимое на странице.Довольно простые вещи.

Однако выяснилось, что мне может понадобиться заменить части контента на основе идентификатора другим содержимым вручную.

Моя идея состоит в том, чтобы раскрыть повторяемое свойство внутриОбъявление пользовательского элемента управления выглядит следующим образом:

<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 Ответ

1 голос
/ 13 сентября 2010

Вы можете попробовать что-то вроде этого:

[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; }
}
...