【问题标题】:How to programmatically populate Sitecore items (Add item and fields)?如何以编程方式填充 Sitecore 项目(添加项目和字段)?
【发布时间】:2023-03-19 12:58:01
【问题描述】:

我现在正在努力通过 C# 将项目添加到 Sitecore 数据库。

下面的代码可以正确执行,但是没有创建项目。

另外,我注意到 item["FieldName"]=value;语法实际上并不填充 Fields 集合。

并且该项目上的 Fields 集合似乎是只读的,所以我不能只调用 .Add (这种方法不存在)。

那么 - 创建子项并填充其字段的正确方法是什么?

我将 Master 数据库用于 Sitecore 后端和此代码。

我在下面使用的代码:

   using (new Sitecore.SecurityModel.SecurityDisabler())
   {

        Database db = Factory.GetDatabase(this.Database);

        foreach (var vacancy in Articles.Tables[0].Rows)
        {
            var rootItem = db.GetItem(this.RootItem);
            DataRow dr = (DataRow) vacancy;

            var newItem = rootItem.Add(string.Format("{0} {1}", dr["numericID"], dr["job_name"]),
                                       db.GetTemplate(new ID("{GUID}")));

            newItem.Editing.BeginEdit();
            newItem["Job Title"] = dr["job_name"].ToString();//
            newItem.Editing.EndEdit();
        } 
}

更多信息: newItem.Template.Fields 返回一个包含 100 个字段的集合

newItem.Fields 返回一个 FieldCollection,其中只有 9 个元素。

当我通过代码时 newItem["field"].Value = value;它不会增加 newItem.Fields 集合计数。

当然,“field”键与 newItem.Template.Fields[x].Name 中的键是一致的。

【问题讨论】:

    标签: c# sitecore sitecore6


    【解决方案1】:

    1) 先检查一些东西 f.ex:

    将模板分配给一个变量并检查你得到了什么。 最好不要通过 ID 而不是通过路径:

    var templateItem = db.GetTemplate("yourTemplatePath");
    

    现在检查这是否是您想要的模板? 确保它已发布(它总是会导致一些不一致)

    2)关于不“可见”的字段,您是否尝试过:item.Fields.ReadAll()

    3) “未创建项目”是什么意思?你会怎么检查呢?

    4) 还有 - 你确定this.Database == "master" 吗?

    【讨论】:

    • 2) 是的,这有助于预先填充 Fields 集合,我会告诉你我是怎么相处的。
    • 3) 使用 Master 数据库时,我没有在 Sitecore 内容编辑器中看到它们。
    • 您的建议有帮助,我错过了 Fields.ReadAll() 调用 :)
    • Spoko - fajnie że mogłem pomóc :)
    【解决方案2】:

    我会推荐两个更改:

    (1)物品命名方式:

    var newItem = rootItem.Add(ItemUtil.ProposeValidItemName(string.Format("{0} {1}", dr["numericID"], dr["job_name"])), db.GetTemplate(new ID("{GUID}")));
    

    此更改将处理来自其他数据源的建议名称中的无效字符。

    (2)字段值设置方法:

    newItem.Fields["Job Title"].Value = dr["job_name"].ToString();
    

    这会将字段的原始值设置为提供的字符串。

    【讨论】:

    • 谢谢。如果我分配了无效值(例如,将文本字符串分配给整数字段)会发生什么?我会从 Sitecore 基本代码中收到一个很好的异常,还是只是(在我的情况下)不会发生写入?
    • 字段总是包含字符串值
    • 感谢 ProposeValidName 的巧妙建议,我也错过了这一点,但在这种情况下这不是问题。我只能将一个答案标记为“已接受”:(
    • 好的,出于安全原因,仍然值得实施#1。也许您的数据在某些时候可能包含在无效字符中?防御性编码 FTW
    【解决方案3】:

    我建议将字段值设置为

    newItem.Fields["Job Title"].Value = dr["job_name"].ToString();//
    

    其他一切正常。

    【讨论】:

    • 如果“job_name”允许空值,则在转换为字符串之前需要检查该值是否不为空。
    • 可能值得一提的是,您可以使用简写 newItem["Job Title"] = "whatever"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2023-03-04
    相关资源
    最近更新 更多