Моего модуль создает пользовательский элемент контента через контроллер:индекса поля для запросов не обновляется, когда заданное значение программно
private ContentItem createContentItem()
{
// Add the field
_contentDefinitionManager.AlterPartDefinition(
"TestType",
cfg => cfg
.WithField(
"NewField",
f => f
.OfType(typeof(BooleanField).Name)
.WithDisplayName("New Field"))
);
// Not sure if this is needed
_contentDefinitionManager.AlterTypeDefinition(
"TestType",
cfg => cfg
.WithPart("TestType")
);
// Create new TestType item
var newItem = _contentManager.New("TestType");
_contentManager.Create(TestItem, VersionOptions.Published);
// Set the added boolean field to true
BooleanField newField = ((dynamic)newItem).TestType.NewField as BooleanField;
newField.Value = true;
// Set title (as date created, for convenience)
var time = DateTime.Now.ToString("MM-dd-yyyy h:mm:ss tt", CultureInfo.InvariantCulture).Replace(':', '.');
newItem.As<TitlePart>().Title = time;
return newItem;
}
Конечный результат этого является новым TestType элемент с полем, который установлен в действительность. Просмотр элемента контента на панели управления, а также проверка ContentItemVersionRecord в базе данных подтверждают правильность установки значения.
Однако запросы, похоже, не работают должным образом в полях, заданных таким образом. Я нашел запись IntegerFieldIndexRecord, которая, как я полагаю, использует прогнозы для заполнения страниц результатов запроса. При этом значение TestField остается равным 0 (false) вместо 1 (true).
Переход на страницу редактирования содержимого контента и просто щелчок «Сохранить» обновления IntegerFieldIndexRecord правильно, что означает, что значение теперь подхвачено запросом. Как можно обновить запись для значений полей, установленных программно?
Соответствующий раздел миграции:
SchemaBuilder.CreateTable(typeof(TestTypePartRecord).Name, table => table
.ContentPartRecord()
);
ContentDefinitionManager.AlterTypeDefinition(
"TestType",
cfg => cfg
.DisplayedAs("Test Type")
.WithPart(typeof(TitlePart).Name)
.WithPart(typeof(ContainablePart).Name)
.WithPart(typeof(CommonPart).Name)
.WithPart(typeof(IdentityPart).Name)
);
Edit: исправить это вручную изменить индекс проекции запись всякий раз, когда меняется значение поля, используя этот вызов:
_fieldIndexService.Set(testResultItem.As<FieldIndexPart>(),
"TestType", // Resolves as TestTypePart, which holds the field
"newField",
"", // Not sure why value name should be empty, but whatever
true, // The value to be set goes here
typeof(bool));
Вы пытались '_contentManager.Publish (TestItem)'? –
Ниже приведены ответы на неполадку. Похоже, обработчик FieldIndexPart не меняет запись автоматически при изменении значения поля.Публикация должна запускать его, но это не так. – ub3rman123