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

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

public interface IRowLifeCycleEx
{
    Guid SectionId { get; } (1)
    Guid Create(SessionContext sessionContext, RowCreateLifeCycleOptions options); (2)
    bool Validate(SessionContext sessionContext, RowValidateLifeCycleOptions options, out List<ValidationResult> validationResults); (3)
    void OnSave(SessionContext sessionContext, RowSaveLifeCycleOptions options); (4)
    bool CanDelete(SessionContext sessionContext, RowDeleteLifeCycleOptions options, out string message); (5)
    void OnDelete(SessionContext sessionContext, RowDeleteLifeCycleOptions options); (6)
}
1 Идентификатор секции, для строк которой предоставляется реализация интерфейса IRowLifeCycleEx.
2 Create — Вызывается при получении разметки создания новой строки секции.
3 Validate — Вызывается перед сохранением изменений строки в БД, с возможностью прервать сохранение.
4 OnSave — Вызывается при сохранении изменений строки — позволяет добавить дополнительную логику в сохранение строки, но без возможности прервать сохранение.
5 CanDelete — Вызывается перед удалением строки секции — позволяет прервать удаление.
6 OnDelete — Вызывается при удалении строки секции — позволяет добавить дополнительную логику в удаление строки, но без возможности прервать удаление.

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

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

using System.Collections.Generic;
using DocsVision.BackOffice.CardLib.CardDefs;
using DocsVision.Platform.WebClient;
using DocsVision.WebClientLibrary.ObjectModel.Services.EntityLifeCycle;
using DocsVision.WebClientLibrary.ObjectModel.Services.EntityLifeCycle.Options;

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

    public override bool Validate(SessionContext sessionContext, RowValidateLifeCycleOptions options, out List<ValidationResult> validationResults)
    {
        var isValid = base.Validate(sessionContext, options, out validationResults);
        var rowData = sessionContext.AdvancedCardManager.GetRowData(options.CardId, RefPartners.Companies.ID, options.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 наследуется от стандартной реализации интерфейса IRowLifeCycleEx — класса DefaultRowLifeCycle, в котором уже реализованы необходимые методы. Помимо класса DefaultRowLifeCycle с реализацией по умолчанию API включает реализующий интерфейс IRowLifeCycleEx базовый класс BaseRowLifeCycle с абстрактными методами.

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

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

public override void InitializeServiceCollection(IServiceCollection services)
{
    services.AddTransient<IRowLifeCycleEx, RefPartnersCompaniesRowLifeCycle>();
}

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