2



我正在在线使用 Sharepoint 中的自定义模板,并且我想在创建子站点时自动将组分配给列表。我做了什么:

  • 在 Visual Studio 中创建模板
  • 为最后一个功能添加了事件接收器
  • 用下面的脚本填充功能激活方法

应该发生的是,当创建子站点时,将触发 featureactivated 方法,并且指定的组将被分配对列表的权限。

    public override void FeatureActivated(SPFeatureReceiverProperties properties)
    {
      using (SPSite site = properties.Feature.Parent as SPSite)
      {
        SPWeb web = (SPWeb)properties.Feature.Parent;

        try
        {
          SPList internalNotes = web.Lists.TryGetList("Internal Notes");
          SPList externalNotes = web.Lists.TryGetList("Notes");

          SPGroup headOfArtists = web.SiteGroups.GetByName("Head of Production");
          SPGroup stageDesigners = web.SiteGroups.GetByName("Logistics Manager");

          web.BreakRoleInheritance(true);

          Tools.GroupHandler.addGroupToSPWeb(web, SPRoleType.Editor, headOfArtists);
          Tools.GroupHandler.addGroupToSPWeb(web, SPRoleType.Reader, stageDesigners);

          internalNotes.BreakRoleInheritance(true);
          externalNotes.BreakRoleInheritance(true);

          Tools.GroupHandler.addGroupToSPList(web, SPRoleType.Reader, headOfArtists, externalNotes);
          Tools.GroupHandler.removeGroupFromList(web, stageDesigners, externalNotes);

        }
        catch (Exception e)
        {
          logger.LogError("Failed to add rights", e);
        }
      }

GroupHandler 类是一个静态类,如下所示:

public static class GroupHandler
  {
    public static void addGroupToSPWeb(SPWeb web, SPRoleType roleType, SPGroup group)
    {
      try
      {
        SPRoleAssignment roleAssignment = new SPRoleAssignment((SPPrincipal)group);
        SPRoleDefinition roleDefinitionRead = web.RoleDefinitions.GetByType(roleType);
        roleAssignment.RoleDefinitionBindings.Add(roleDefinitionRead);
        web.RoleAssignments.Add(roleAssignment);
      }
      catch (Exception e)
      {
        logger.LogError("Failed to add rights", e);
      }
}

public static void addGroupToSPList(SPWeb web, SPRoleType roleType, SPGroup group, SPList list)
{
  try
  {
    SPRoleAssignment roleAssignment = new SPRoleAssignment((SPPrincipal)group);
    SPRoleDefinition roleDefinitionRead = web.RoleDefinitions.GetByType(roleType);

    roleAssignment.RoleDefinitionBindings.Add(roleDefinitionRead);
    //list.RoleAssignments.Remove(group);
    list.RoleAssignments.Add(roleAssignment);
  }
  catch (Exception e)
  {
     logger.LogError("Failed to add rights", e);
  }
}

public static void removeGroupFromList(SPWeb web, SPGroup group, SPList list)
{
  try
  {
    list.RoleAssignments.Remove(group);
  }
  catch (Exception e)
  {
     logger.LogError("Failed to add rights", e);
  }
}
}

问题
当我使用包含此事件接收器的模板创建子站点时,事件接收器只是丢弃了我想要分配给特定列表的组(在上面的示例中“生产主管和”物流经理“。我可以” t 调试任何东西,因为它是在线 Sharepoint,并且在我的 Sandbox Solutions 测试环境中一切正常。

4

1 回答 1

0

我的建议是不要使用带有托管代码的沙盒解决方案,而是使用 SharePoint 应用程序模型项目作为 SharePoint 托管或提供程序托管来执行此操作......主要是因为您使用的方法已被弃用并且无法像这样进行调试你已经说过了。Provider Hosted 可能更容易跳转,因为您可以在 MVC 或 Web Forms 项目中使用托管代码 CSOM 来执行此操作。然后,您可以非常轻松地使用远程事件接收器并对其进行调试。在 codeplex 上的 Office AMS 示例中,有一个示例项目展示了如何使用远程事件接收器并利用 Visual Studio 2013 中的 Azure 服务总线方法对其进行实时调试http://officeams.codeplex.com/. 此外,在该代码示例下载中,还有一个在 App 模型中管理安全性的示例,所以你应该很高兴。

于 2014-05-21T05:53:08.807 回答