以编程方式将项目添加到可重复项目

时间:2011-12-09 14:19:20

标签: asp.net umbraco

如何在c#:

中以编程方式将项添加到可重复属性中

假设我有一个节点(节点ID为1234),并且在其中有公司列表属性,其中每个项目都有comapny名称和图像(媒体选择器)。

如何以编程方式添加项目?

这是我到目前为止所拥有的:

        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(...)

感谢。

我指的是: Repeatable Custom Content

更新: 我认为解决方案是更新umbraco.config中的xml。 我在umbraco.config中有以下xml:

<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);

2 个答案:

答案 0 :(得分:0)

  

我能够以编程方式更新umbraco.config,但结果如下   在后端没有更新,所以当我发布公司时   再次,节点删除更改。我怎样才能更新   umbraco.config并发布节点?

你正在走错路。 umbraco.config文件是Umbraco数据库的只读 XML表示形式,由Umbraco生成,然后进行高速缓存。它不打算直接写入或访问。每次在Umbraco中发布页面时,都会重新生成此文件,因此不会保留更新的原因。

您也不想直接尝试写入Umbraco数据库。它非常复杂,需要很多关系。同样,它不打算写入。

要直接更新节点,您真正需要做的就是使用Umbraco Document API。这允许您直接对节点进行写入访问,您可以以编程方式发布这些节点。简单的例子:

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发帖。

答案 1 :(得分:0)

我设法使用此代码解决了问题:

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);