Реализация методов для работы со строками секций из разметок
Программисту предоставляется возможность добавить новую функциональность в механизмы создания и работы со строками секциями из разметок. Данная возможность реализуется с помощью специального класса с интерфейсом 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. |
Серверное расширение должно быть опубликовано стандартным образом.