SharePoint日历事件只需针对特定用户显示。我在日历列表中添加了一个人员和组列..并从该列中获取用户..之后我不知道如何更改这些用户的权限?这些用户只能查看事件。 我可以在后面的代码中设置权限。请帮忙。
答案 0 :(得分:0)
实现此目的的最佳方法是创建自己的ListItemReceiver并处理ItemAdded和ItemUpdated事件。处理这些事件时,您可以根据列设置权限。此解决方案的缺点是每个事件都有自己的权限集。在MSDN限制中,单个列表中的个别权限集不应超过5000个。以下是如何设置项目权限的简单示例(在本例中为当前用户):
SPRoleDefinition roldDef = web.RoleDefinitions.GetByType(SPRoleType.Reader);
SPRoleAssignment rolAssign = new SPRoleAssignment(SPContext.Current.Web.CurrentUser);
rolAssign.RoleDefinitionBindings.Add(roldDef);
if (!event.HasUniqueRoleAssignments) {
event.BreakRoleInheritance(false);
event.RoleAssignments.Add(rolAssign);
}
此代码存在一个潜在问题。用户更改项目必须具有足够的权限来更改项目的权限。为了确保这一点,最好将该代码包装在SPSecurity.RunWithElevatedPrivileges委托中。
其他可能性是按列创建视图过滤日历事件。这不能在UI中完成(您不能在查询中指定CAML运算符),但可以在SharePoint Designer中完成。此解决方案的优点在于,由于所有事件都具有继承权,因此更容易且资源消耗更少。
答案 1 :(得分:0)
您可以使用此功能。 http://permissionmanagement.codeplex.com/ 该解决方案允许您动态地(从列)为任何类型的列表创建规则权限。在您的情况下,您为列项中定义的用户分配权限。
如果您想优化您的应用程序(具有单一权限的5000个项目),您可以使用某些逻辑,但为每个用户创建一个文件夹(具有单一权限)并将项目移动到此文件夹。
答案 2 :(得分:0)
public override void ItemAdded(SPItemEventProperties properties)
{ SPListItem fromListItems = properties.ListItem;
properties.ListItem.BreakRoleInheritance(false);
UpdateListItems(properties);
base.ItemAdded(properties);
}
private void UpdateListItems(SPItemEventProperties properties)
{
SPWeb currentWeb;
using (currentWeb = properties.OpenWeb())
{
try
{
SPUser spLookUpUser = null;
SPFieldLookupValue fieldLookupValue = new SPFieldLookupValue(properties.ListItem["user"].ToString());
string lookupValues = fieldLookupValue.LookupValue;
SPFieldLookupValueCollection fieldLoodUpValueCollection = new SPFieldLookupValueCollection(properties.ListItem["user"].ToString());
foreach (SPFieldLookupValue lookupValue in fieldLoodUpValueCollection)
{
string lookUpUser = lookupValue.LookupValue;
spLookUpUser = currentWeb.EnsureUser(lookUpUser);
SPPrincipal assignee = (SPPrincipal)spLookUpUser;
GrantPermission(properties.ListItem, currentWeb, SPRoleType.Reader, assignee);
}
properties.ListItem.SystemUpdate();
}
catch (Exception ex)
{
throw ex;
}
}
}
private static void GrantPermission(SPListItem CurrentListItem, SPWeb oSPWeb, SPRoleType SPRoleType, SPPrincipal SPPrincipal)
{
try
{
SPRoleDefinition oSPRoleDefinition = oSPWeb.RoleDefinitions.GetByType(SPRoleType);
SPRoleAssignment oSPRoleAssignment = new SPRoleAssignment(SPPrincipal);
oSPRoleAssignment.RoleDefinitionBindings.Add(oSPRoleDefinition);
CurrentListItem.RoleAssignments.Add(oSPRoleAssignment);
CurrentListItem.Update();
}
catch (Exception ex)
{
throw ex;
}
}