SharePoint日历事件仅显示给特定用户

时间:2013-12-28 18:50:13

标签: sharepoint

SharePoint日历事件只需针对特定用户显示。我在日历列表中添加了一个人员和组列..并从该列中获取用户..之后我不知道如何更改这些用户的权限?这些用户只能查看事件。 我可以在后面的代码中设置权限。请帮忙。

3 个答案:

答案 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;
        }
    }