Могу ли я изменить значение свойства в TreeNode в событии DocumentEvents.Update.Before? - PullRequest
0 голосов
/ 28 января 2019

Конкретное поле в TreeNode, которое мы используем, должно быть уникальным среди его родных элементов.Чтобы убедиться, что он уникален, я пытаюсь изменить значения поля в TreeNode, когда пользователь изменяет и сохраняет его.Это заставляет событие save снова срабатывать, что вызывает мой обработчик событий, который снова запускает событие.Это нежелательный цикл.

Есть ли способ обновить treenode, не вызывая событие update?

Единственный способ, которым я могу думать, - это выполнить SQL-запрос непосредственно к базе данных,но я надеюсь, что есть лучший способ.

TreeNode.SubmitChanges (false);и TreeNode.Update ();оба запускают событие DocumentEvents.Update, так что это не решило проблему.

Я не вижу различий между DocumentEventArgs, когда событие вызывается из пользовательского интерфейса Kentico или когда оно запускается из моего C #code.

Вызов обработчика события:

DocumentEvents.Update.Before += 
uniquePageAliasModule.EnsureUniquePageAliasOnUpdate;

Реализация обработчика события:

treeNode.SetValue((Metadata.MetadataPageUrlPath), path);
treeNode.SubmitChanges(false);

Желаемый: сохранить изменения в TreeNode и не запускать DocumentEvents.Update.событие

Фактически: сохраняет изменения в TreeNode и запускает событие DocumentEvents.Update

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Вы можете временно подавить событие DocumentEvents.Update.

DocumentEvents.Update.Allow = false;
treeNode.Update();
DocumentEvents.Update.Allow = true;

Или как метод:

public void Save(BaseInfo baseInfo, bool doFireSaveEvent)
{
    var allowsUpdateEvents = DocumentEvents.Update.Allow;

    DocumentEvents.Update.Allow = doFireSaveEvent;
    try
    {
        baseInfo.Update();
    }
    catch (Exception e)
    {
        EventLogProvider.LogEvent(
            "E",
            $"{nameof(TreeNodeRepository)}.{ nameof(TreeNodeRepository.Save)}",
            "TREENODE_CAN_NOT_BE_SAVED",
            e.Message);
    }
    finally
    {
        DocumentEvents.Update.Allow = allowsUpdateEvents;
    }
}
0 голосов
/ 28 января 2019

Вы можете использовать RequestStockHelper или Контроль рекурсии , как это было упомянуто в этой статье .Я лично предпочитаю использовать RequestStockHelper, он работает как контекст запроса.

Вы можете попробовать DocumentEvents.Update.Continue = false.на эту тему существует старая тема

0 голосов
/ 28 января 2019

Попробуйте что-то вроде этого:

TreeNode treeNode = e.Node;
treeNode.SetValue((Metadata.MetadataPageUrlPath), path);
treeNode.Update();

Kentico должен сам предотвратить цикл обработки событий.

...