编写Sitecore批量建项任务,如何用GlassMapper简化多字段赋值?
Sitecore批量创建项:用GlassMapper或同类工具简化字段赋值
当然可以用GlassMapper解决这个问题,而且GlassMapper并不局限于MVC上下文——它完全支持Sitecore后台的常规API操作,包括批量创建项的任务场景。
具体实现思路:
- 创建模板对应的实体类
针对你的Sitecore数据模板,定义一个C#实体类,用GlassMapper的特性标记映射模板字段,彻底避免字段名称硬编码:
[SitecoreType(TemplateId = "{你的模板ID}", AutoMap = true)] public class YourCustomItem { [SitecoreId] public virtual Guid Id { get; set; } [SitecoreField("Title")] public virtual string Title { get; set; } // 其他几百个字段同理,用SitecoreField标记对应模板字段名 [SitecoreField("Description")] public virtual string Description { get; set; } [SitecoreField("Publish Date")] public virtual DateTime PublishDate { get; set; } }
- 批量创建项的代码
借助GlassMapper的ISitecoreService,直接操作实体类即可,它会自动把实体属性值同步到Sitecore项的对应字段,省去重复的Fields["xxx"].Value代码:
// 初始化SitecoreService(后台场景可指定目标数据库,比如Sitecore.Context.Database) var sitecoreService = new SitecoreService(Sitecore.Context.Database); // 循环批量创建 for (int i = 0; i < 1000; i++) { // 实例化实体并赋值 var newItem = new YourCustomItem { Title = $"批量项标题{i}", Description = $"批量项描述{i}", PublishDate = DateTime.Now // 其他字段直接给属性赋值即可 }; // 指定父项,将实体保存为Sitecore项 var parentItem = Sitecore.Context.Database.GetItem("{父项ID}"); sitecoreService.Create(newItem, parentItem); }
同类替代方案
如果不想用GlassMapper,也可以自己实现轻量映射逻辑:
- 自定义特性标记实体属性与模板字段的对应关系
- 用反射遍历实体属性,自动给Sitecore项的对应字段赋值
不过GlassMapper已经封装了成熟的映射逻辑、特殊字段类型转换(比如DateTime、富文本等),比自己造轮子更高效可靠。
批量操作注意事项
- 批量创建数千个项时,建议用
Sitecore.Data.Events.EventDisabler禁用Sitecore事件和验证,避免不必要的性能损耗 - 可以分批次提交,比如每创建100个项调用一次
Sitecore.Data.Database.SaveChanges() - 确保GlassMapper的配置正确,模板ID和字段名映射无误,避免字段赋值失败
内容的提问来源于stack exchange,提问作者Anthony Fernandes
相关产品推荐
相关产品推荐

