Read Only
Объект, открытый в режиме Только чтение
(Read-only
) не может быть изменен пользователем, данные, хранящиеся в объекте, будут доступны только для чтения.
Режим ReadOnly
может понадобиться в разных ситуациях, к примеру:
- Один пользователь открыл объект на редактирование, в это время другой пользователь пытается также открыть этот же объект на редактирование.
- У пользователя нет прав изменять какое-либо поле объекта, или сам объект, но есть право просматривать данные.
Составляющие режима ReadOnly
Режим можно условно поделить на 3 составляющие:
- Блокировка интерфейса пользователя
- Блокировка объекта данных в памяти приложения
- Блокировка объекта данных в базе данных
Блокировка интерфейса пользователя
Если пользователь не может вносить изменения в объект, он должен это осознавать в момент открытия формы редактирования. Если объект в данный момент недоступен из-за блокировки другим пользователем, рекомендуется вывести предупреждение типа Объект заблокирован другим пользователем. Вы желаете открыть объект только на чтение? Да\Нет
.
Если пользователь все же желает открыть объект в режиме ReadOnly
, необходимо заблокировать контролы для редактирования полей объекта. Также необходимо скрыть кнопки Сохранить
и Сохранить и закрыть
(только для случая полной блокировки, а не блокировки отдельных полей объекта).
Для блокировки интерфейса пользователя в Web-приложениях используется класс WebBinder.
WebBinder позволяет либо заблокировать объект полностью, либо заблокировать только некоторые его поля.
Важно: Стоит отметить, что WebBinder блокирует только те поля объекта, которые зарегистрированы в WebBinder’e и содержатся в передаваемом представлении, а также только серверные контролы, которые имеют свойства ReadOnly
или Enabled
.
- Полная блокировка объекта через WebBinder осуществляется вызовом метода
wb.SetReadOnlyForm(this.Controls, this.View, true);
где wb
это экземпляр WebBinder’a на конкретной странице.
- Еще один вариант полной блокировки: установка свойства ReadOnly у конкретной формы
this.ReadOnly = true;
- Частичная блокировка объекта (блокировка отдельных полей) осуществляется вызовом метода
wb.SetReadOnlyProperty(this.Controls, "ФИО", true);
где ФИО
это наименование свойства, которое нужно заблокировать для редактирования.
- Еще один вариант частичной блокировки - блокировка конкретного контрола путем вызова метода
wb.SetReadonlyToControl(ctrlФИО, true);
где ctrlФИО
- контрол, который необходимо заблокировать для редактирования.
Блокировка объекта данных при открытии страницы редактирования
Чтобы заблокировать объект при открытии страницы достаточно послать в GET-запросе параметр &mode=readonly
.
Пример можно посмотреть в статье Добавление кнопки в тулбар или в строки WebObjectListView.
Блокировка объекта данных в памяти приложения
Блокировка объекта в памяти осуществляется вызовом метода объекта DataObject.LockObject(Key)
, где Key
- некий ключ блокировки типа Guid
. Разблокировать объект можно только этим ключом при помощи метода DataObject.UnLockObject(Key)
.
При вызове метода LockObject
блокировка в базу не отправляется.
Пример можно посмотреть в статье Как открыть объект только на чтение.
Блокировка объекта данных в базе данных
Для блокировки используется поддерживаемый технологией Сервис блокировок.
Блокировка объекта в базе данных железно защищает объект от изменений объекта другими пользователями. Создается запись в таблице STORMNETLOCKDATA
и, пока она там существует, изменить объект может только пользователь, заблокировавший объект.
Пример можно посмотреть в статье Сервис блокировок.