I have the following problem with this code:
public override void ItemUpdating(SPItemEventProperties properties)
{
base.ItemUpdating(properties);
const string fieldInternalNameWrt = "UserWrt";
const string fieldInternalNameRdr = "UserRdr";
SPListItem item = properties.ListItem;
SPUser userWrt = null;
SPUser userRdr = null;
if (properties.AfterProperties[fieldInternalNameWrt] != null)
{
string userValueWrt = properties.AfterProperties[fieldInternalWrt].ToString();
userWrt = GetSPUserFromId(properties.ListTitle, userValueWrt, fieldInternalWrt, properties);
}
if (properties.AfterProperties[fieldInternalNameRdr] != null)
{
string userValueRdr = properties.AfterProperties[fieldInternalNameRdr].ToString();
userRdr = GetSPUserFromId(properties.ListTitle, userValueRdr, fieldInternalNameRdr, properties);
}
if (userWrt == null && userRdr == null)
return;
SPRoleAssignment roleAssignmentWrt = null;
if (userWrt != null)
{
roleAssignmentWrt = new SPRoleAssignment(userWrt);
var roleDefinition = properties.Web.RoleDefinitions.GetByType(SPRoleType.Contributor);
roleAssignmentWrt.RoleDefinitionBindings.Add(roleDefinition);
}
SPRoleAssignment roleAssignmentRdr = null;
if (userRdr != null)
{
roleAssignmentRdr = new SPRoleAssignment(userRdr);
var roleDefinition = properties.Web.RoleDefinitions.GetByType(SPRoleType.Reader);
roleAssignmentRdr.RoleDefinitionBindings.Add(roleDefinition);
}
try
{
this.EventFiringEnabled = false;
lock (_thisLock)
{
SPSecurity.RunWithElevatedPrivileges(() =>
{
item.BreakRoleInheritance(false);
foreach (SPRoleAssignment assignment in item.RoleAssignments)
{
assignment.RoleDefinitionBindings.RemoveAll();
assignment.Update();
}
if (roleAssignmentWrt != null)
item.RoleAssignments.Add(roleAssignmentWrt);
if (roleAssignmentRdr != null)
item.RoleAssignments.Add(roleAssignmentRdr);
item.Update();
});
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
this.EventFiringEnabled = true;
}
}
public static SPUser GetSPUserFromId(string listName, string currentValue, string nameField, SPItemEventProperties properties)
{
SPFieldUserValue fieldValue;
using (SPWeb web = properties.OpenWeb())
{
var userField = (SPFieldUser)web.Lists[listName].Fields.GetField(nameField);
fieldValue = (SPFieldUserValue)userField.GetFieldValue(currentValue);
}
return fieldValue.User;
}
the item's permissions was changed but I receive the following error!
http://i.stack.imgur.com/l1lgn.jpg1
anyone knows why?