Если вам нужен автоматизированный процесс, который происходит при добавлении нового дома, то для этого есть достаточно простой метод, использующий EventReceivers. Если у вас нет опыта работы с EventReceivers, ознакомьтесь с этой статьей . Вам нужно будет создать события ItemAdded и ItemUpdated с почти одинаковым содержимым - одно для того, когда дом впервые был построен, и одно для того, когда регион для дома когда-либо изменяется. Во-первых, дом должен нарушить наследование ролей, если у него еще нет уникальных назначений. Теперь, если регион не изменился в обновлении, нет необходимости продолжать. В противном случае вам необходимо очистить текущий набор разрешений, а затем получить регион в поисковом значении, просмотрев список, а затем идентификатор элемента. Переберите разрешения в регионе для всех, у кого есть хотя бы разрешение на чтение, и добавьте этих пользователей в дом. Когда это будет сделано, обновитесь, и теперь единственные люди, которые увидят этот дом, - это те, кто может читать этот конкретный регион. Ниже приведено общее описание того, как может выглядеть код в приемнике событий.
using (SPSite site = new SPSite(properties.WebUrl))
{
using (SPWeb web = site.OpenWeb())
{
SPListItem houseItem = properties.ListItem;
SPList regionList = web.Lists["Region"];
if (houseItem.HasUniqueRoleAssignments)
{
houseItem.BreakRoleInheritance(false); //Clears all
}
//After confirming that the region has changed and is not empty/null...
SPFieldLookupValue regionLookup = houseItem["RegionLookup"] as SPFieldLookupValue;
SPListItem regionItem = regionList.GetItemById(regionLookup.LookupId);
SPRoleDefinition readAccess = web.RoleDefinitions["Read"];
foreach (SPRoleAssignment userRole in regionItem.RoleAssignments)
{
//READ CHECK
if (userRole.RoleDefinitionBindings.Contains(readAccess))
{
houseItem.RoleAssignments.Add(userRole);
}
}
this.DisableEventFiring();
houseItem.SystemUpdate(false);
this.EnableEventFiring();
}
}
Обратите внимание, что для точки, отмеченной //READ CHECK
, весь этот фрагмент кода проверяет, назначено ли определение роли «Чтение» этому пользователю для региона. Если вы хотите специально проверить разрешение «ViewItem», вам нужно будет выполнить итерацию по всем RoleDefinitionBindings в этом RoleAssignment и проверить BasePermissions, чтобы увидеть, содержит ли оно «ViewItem».