Я бьюсь об это головой весь день, и у меня закончились идеи. В основном потому, что Glass.mapper не поддерживает шаблоны веток, я создаю элемент sitecore, используя стандартные методы БД. Затем я использую GlassCast<T>()
, чтобы получить правильно типизированный объект.
Этот типизированный объект, по-видимому, содержит поле идентификатора, однако, когда я пытаюсь сохранить объект, я получаю сообщение об ошибке:
Вы не можете сохранить класс, который не содержит свойства, представляющего идентификатор элемента.
Вот мой метод:
private Glass.Mapper.Sc.ISitecoreService SitecoreService;
public T CreateFromBranch<T>(string parentPath, string itemName,
Guid branchTemplateId) where T : class, ICmsItem
{
Item parent = SitecoreService.Database.GetItem(parentPath);//SitecoreService.GetItem<Item>(parentPath);
if (parent == null)
throw new NullReferenceException("Cannot load item to act as parent from path: " + parentPath);
BranchItem branch = SitecoreService.Database.GetItem(new ID(branchTemplateId));
if (branch == null)
throw new ApplicationException("Failed ot find template branch with the id:" + branchTemplateId);
Item itemFromBranch = parent.Add(itemName, branch);
if (itemFromBranch == null)
throw new ApplicationException("Failed to create item from branch template. BranchId: " + branchTemplateId);
itemFromBranch.Fields.ReadAll();
T typedItem = itemFromBranch.GlassCast<T>();
//Id is accessible here and is the id of the item that is created!
Guid id = typedItem.Id;
typedItem.DisplayName = itemDisplayName;
//Exception thrown here!
SitecoreService.Save(typedItem);
return typedItem;
}
Интерфейс:
[SitecoreType(AutoMap = true)]
public interface ICmsItem
{
//Id flagged here! Same in the concrete class
[SitecoreId]
Guid Id { get; }
[SitecoreInfo(SitecoreInfoType.Name)]
string Name { get; set; }
[SitecoreInfo(SitecoreInfoType.DisplayName)]
string DisplayName { get; set; }
[SitecoreInfo(SitecoreInfoType.Path)]
string Path { get; set; }
[SitecoreInfo(SitecoreInfoType.TemplateId)]
Guid TemplateId { get; set; }
[SitecoreField(FieldName = "__Never publish")]
bool NeverPublish { get; set; }
[SitecoreField(FieldName = "__Icon")]
string CmsIcon { get; set; }
[SitecoreField(FieldName = "__Workflow")]
Guid? Workflow { get; set; }
[SitecoreField(FieldName = "__Workflow state")]
Guid? WorkflowState { get; set; }
[SitecoreField(FieldName = "__Sortorder")]
int SortOrder { get; set; }
}
элемент создается в sitecore. Но у него нет обновленного отображаемого имени. Если я изменю код так, чтобы он вообще не использовал стеклянный картограф:
if (!string.IsNullOrWhiteSpace(itemDisplayName))
{
itemFromBranch.EditField("__Display name", itemDisplayName);
}
Оно работает!
Кто-нибудь понял, что я здесь делаю неправильно?
set
к свойствуId
, чтобы увидеть, имеет ли это какое-то значение. - person jammykam   schedule 02.11.2015