2011-12-09 95 views
0

我如何C#编程的项目添加到一个可重复的特性:编程方式将项目添加到重复的项目

比方说,我有一个节点(节点ID 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(...) 

感谢。

,我指的是将整套: 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); 

回答

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); 
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如果您需要更多的帮助。

+0

谢谢,我看到你在说什么,但我的情况下,不涉及财产的简单升级,而是一个可重复的特性的更新(该属性是companyList,它具有“子属性”的名称和图像例如) – user560498

+0

然后,您需要制作您的XML并将其添加为属性的内容。 –

相关问题