Реализация методов для работы со строками секций из разметок

Программисту предоставляется возможность добавить новую функциональность в механизмы создания и работы со строками секциями из разметок. Данная возможность реализуется с помощью специального класса с интерфейсом IRowLifeCycle. Интерфейс IRowLifeCycle предоставляет методы, которые вызываются на различных этапах работы со строкой секции:

public interface IRowLifeCycle
{
    Guid Create(SessionContext sessionContext, Guid cardId, Guid? parentRowId, Guid? parentTreeRowId); (1)
    bool Validate(SessionContext sessionContext, Guid cardId, Guid rowId, out List<ValidationResult> validationResults); (2)
    void OnSave(SessionContext sessionContext, Guid cardId, Guid rowId); (3)
    bool CanDelete(SessionContext sessionContext, Guid cardId, Guid rowId, out string message); (4)
    void OnDelete(SessionContext sessionContext, Guid cardId, Guid rowId); (5)
}
1 Create — Вызывается при получении разметки создания новой строки секции.
2 Validate — Вызывается перед сохранением изменений строки в БД, с возможностью прервать сохранение.
3 OnSave — Вызывается при сохранении изменений строки — позволяет добавить дополнительную логику в сохранение строки, но без возможности прервать сохранение.
4 CanDelete — Вызывается перед удалением строки секции — позволяет прервать удаление.
5 OnDelete — Вызывается при удалении строки секции — позволяет добавить дополнительную логику в удаление строки, но без возможности прервать удаление.

Указанные методы используются исключительно при выполнении стандартных операций со строками из разметок или с использованием JS WebAPI разметок. В других случаях методы интерфейса IRowLifeCycle не вызываются и не влияют на работу сервера Web-клиента со строками секций.

Следующий код демонстрирует пример реализации класса, в котором определена собственная функция проверки данных строки секции перед сохранением изменений (Validate).

public class RefPartnersCompaniesRowLifeCycle : DefaultRowLifeCycle (1)
{
    public RefPartnersCompaniesRowLifeCycle()
        : base(RefPartners.Companies.ID)
    {
    }

    public override bool Validate(SessionContext sessionContext, Guid cardId, Guid rowId, out List<ValidationResult> validationResults)
    {
        var isValid = base.Validate(sessionContext, cardId, rowId, out validationResults);
        var rowData = sessionContext.AdvancedCardManager.GetRowData(cardId, RefPartners.Companies.ID, rowId);
        var companyName = rowData.GetString(RefPartners.Companies.Name);
        if (string.IsNullOrEmpty(companyName))
        {
            isValid = false;
            var validationResult = new ValidationResult
            {
                Message = "Наименование компании не заполнено"
            };
            validationResults.Add(validationResult);
        }
        return isValid;
    }
}
1 RefPartnersCompaniesRowLifeCycle наследуется от стандартной реализации интерфейса IRowLifeCycle — класса DefaultRowLifeCycle, в котором уже реализованы необходимые методы. Помимо класса DefaultRowLifeCycle с реализацией по умолчанию API включает реализующий интерфейс IRowLifeCycle базовый класс BaseRowLifeCycle с абстрактными методами.

Метод Validate проверяет строку rowId на заполненность поля RefPartners.Companies.Name, и, если данное поле пустое, возвращает ошибку validationResult.

Полученный тип с интерфейсом IRowLifeCycle нужно добавить в IoC-контейнер в ядре расширения:

public override void InitializeContainer(ContainerBuilder containerBuilder) {
    var sectionID = new Guid("C78ABDED-DB1C-4217-AE0D-51A400546923"); (1)
    containerBuilder.RegisterType<RefPartnersCompaniesRowLifeCycle>().Keyed<IRowLifeCycle>(sectionID).SingleInstance();
}
1 Идентификатор секции, для строк которой предоставляется реализация интерфейса IRowLifeCycle.

Серверное расширение должно быть опубликовано стандартным образом.