Добавление элементов программно к повторяющимся элементам

Как программно добавить элемент к повторяемому свойству в С#:

скажем, у меня есть узел (идентификатор узла 1234), и в нем свойства списка компаний, где каждый элемент имеет имя и изображение компании (средство выбора).

как добавить элемент программно?

Вот что у меня есть до сих пор:

        XPathNodeIterator xpathIterator = umbraco.library.GetXmlNodeById(NodeId.ToString());
        XElement node = XElement.Parse(xpathIterator.Current.OuterXml);

        var list = node.Descendants(propertyAlias).FirstOrDefault();

        // how do I add items here ? something like:
        list.Descendants().Add(...)

Спасибо.

Я имею в виду пакет: Повторяемый пользовательский контент

обновление: я думаю, что решение состоит в том, чтобы обновить xml в umbraco.config. У меня есть следующий xml в umbraco.config:

<Companies id="1176" parentID="1447" ...>
    <umbracoNaviHide>0</umbracoNaviHide>
    <companyList>
        <item>
          <data alias="title">Company1</data>
          <data alias="image" />
          <data alias="text" />
          <data alias="date" />
        </item>
        <item>
          <data alias="title">Company2</data>
          <data alias="image">1943</data>
          <data alias="text" />
          <data alias="date" />
        </item>
      </items>
    </companyList>
  </Companies>

Я могу программно обновить umbraco.config, но результаты не обновляются в серверной части, поэтому, когда я снова публикую узел компаний, изменения удаляются. Как я могу обновить umbraco.config и опубликовать узел? Может быть, мне следует обновить базу данных напрямую?

Мой код:

Document companiesDoc = new Document(COMPANIESNODEID);

        XmlDocument document = content.Instance.XmlContent;

        XmlNode n = document.SelectSingleNode("//Companies[@id=" + COMPANIESNODEID.ToString() + "]").SelectSingleNode("//items");


        XmlNode newItem = document.CreateNode(XmlNodeType.Element, "item", null);


        XmlNode dName = document.CreateNode(XmlNodeType.Element, "data", null);
        XmlAttribute xn = document.CreateAttribute("alias");
        xn.Value = "title";
        dName.Attributes.Append(xn);
        dName.InnerText = companyName;

        XmlNode dImage = document.CreateNode(XmlNodeType.Element, "data", null);
        XmlAttribute xi = document.CreateAttribute("alias");
        xi.Value = "image";
        dImage.Attributes.Append(xi);
        dImage.InnerText = companyImage;

        XmlNode dText = document.CreateNode(XmlNodeType.Element, "data", null);
        XmlAttribute xt = document.CreateAttribute("alias");
        xt.Value = "text";
        dText.Attributes.Append(xt);

        XmlNode dDate = document.CreateNode(XmlNodeType.Element, "data", null);
        XmlAttribute xd = document.CreateAttribute("alias");
        xd.Value = "date";
        dDate.Attributes.Append(xd);

        newItem.AppendChild(dName);
        newItem.AppendChild(dImage);
        newItem.AppendChild(dText);
        newItem.AppendChild(dDate);

        n.AppendChild(newItem);

person user560498    schedule 09.12.2011    source источник


Ответы (2)


Я могу программно обновить umbraco.config, но результаты не обновляются в серверной части, поэтому, когда я снова публикую узел компаний, изменения удаляются. Как я могу обновить umbraco.config и опубликовать узел?

Вы идете об этом неправильно. Файл umbraco.config представляет собой доступное только для чтения XML-представление базы данных Umbraco, созданное Umbraco и затем кэшированное. Он не предназначен для записи или доступа напрямую. Каждый раз, когда вы публикуете страницу в Umbraco, этот файл создается заново, поэтому ваши обновления не сохраняются.

Вы также не хотите пытаться напрямую писать в базу данных Umbraco. Это очень сложно и требует много отношений. Опять же, он не предназначен для записи.

Для непосредственного обновления узлов вам действительно нужно использовать API документов Umbraco. Это дает вам прямой доступ для записи к узлам, которые вы можете программно опубликовать. Простой пример:

Document doc = new Document(1234);
doc.getProperty("bodyText").Value = "<p>Your body text</p>";
doc.getProperty("articleDate").Value = DateTime.Now;
User author = User.GetUser(0); 
doc.Publish(author);
umbraco.library.UpdateDocumentCache(doc.Id);

Если вам нужна дополнительная помощь, я предлагаю опубликовать сообщение на http://our.umbraco.org/forum.

person Dan Diplo    schedule 09.12.2011
comment
Спасибо, я понимаю, о чем вы говорите, но в моем случае речь идет не о простом обновлении свойства, а об обновлении повторяющегося свойства (свойство — companyList, и оно имеет имя и изображение подсвойств, например) - person user560498; 10.12.2011
comment
Затем вам нужно создать свой XML и добавить его в качестве содержимого свойства. - person Dan Diplo; 10.12.2011

Мне удалось решить проблему с помощью этого кода:

var doc = new Document(COMPANIESNODEID);


        XDocument xdoc = XDocument.Parse(doc.getProperty("companyList").Value.ToString());

        xdoc.Element("items").Add(new XElement("item",
            new XElement("data", new XAttribute("alias", "title"), companyName),
            new XElement("data", new XAttribute("alias", "image"), companyImage)));

        doc.getProperty("companyList").Value = xdoc.ToString();


        doc.Save();

        doc.Publish(new User(0));
        umbraco.library.UpdateDocumentCache(doc.Id);
person user560498    schedule 10.12.2011