Mon module crée un élément de contenu personnalisé via le contrôleur:index des champs pour les requêtes non mise à jour lorsque mis en valeur par programmation
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;
}
Le résultat final de c'est un nouvel élément TestType avec un champ qui est défini sur true. L'affichage de l'élément de contenu dans le tableau de bord ainsi que l'examen de ContentItemVersionRecord dans la base de données confirme que la valeur a été définie correctement. Toutefois, les requêtes ne semblent pas fonctionner correctement sur les champs définis de cette manière. J'ai trouvé l'enregistrement IntegerFieldIndexRecord, qui est ce que je suppose que les projections utilisent pour remplir les pages de résultats de requête. Sur ce, la valeur de TestField reste à 0 (faux), au lieu de 1 (vrai). Si vous accédez à la page d'édition de l'élément de contenu et que vous cliquez simplement sur "enregistrer", IntegerFieldIndexRecord met à jour correctement IntegerFieldIndexRecord, ce qui signifie que la valeur est maintenant récupérée par la requête. Comment l'enregistrement peut-il être mis à jour pour les valeurs de champs définies par programme?
section pertinente de la migration:
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: Le correctif pour cela est de modifier manuellement l'index de projection enregistrement lors du changement d'une valeur de champ, en utilisant cet appel:
_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));
Avez-vous essayé '_contentManager.Publish (TestItem)'? –
Les réponses ci-dessous ont corrigé le problème. Il semble que le gestionnaire de FieldIndexPart ne modifie pas automatiquement l'enregistrement lorsque la valeur du champ change.La publication devrait le déclencher, mais ce n'est pas le cas. – ub3rman123