如何在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);
答案 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);