如何将列表项设为只读

时间:2010-10-15 01:44:48

标签: sharepoint sharepoint-2010

我有一个列表(假设问题列表),并且有一个与之关联的工作流程。工作流程可以将项目的状态列调整为“已关闭”。关闭项目的状态后,我想将其设置为只读,以便没有人可以编辑该项目或为该项目创建另一个工作流程实例。

实现这一目标的最佳方式是什么?

5 个答案:

答案 0 :(得分:4)

可以设置项级权限,因此您可以逐项覆盖列表级权限。将此功能添加到现有工作流程中可能最有意义,但当然SharePoint没有为您提供任何开箱即用的功能。

幸运的是,您可以通过创建自己的自定义操作来扩展SharePoint的工作流程。在SP2010中执行此操作的过程与2007年基本相同;看看this MSDN tutorial for an overview of the process

在名为SPDActivities at CodePlex的开源产品中还提供了一个方便的自定义活动包。您特别感兴趣的是Grant Permission on Item activity。即使您选择不使用整个软件包,也可以检查源代码并查看实现自己的版本(我为过去的项目做了类似的事情)。

一旦您有用于设置项目权限级别的工作流操作,只需在现有工作流程中添加一个步骤,即可为受影响的受众群体或群组设置Read权限。

答案 1 :(得分:2)

你看过SPUtility.js了吗?您可以获取状态字段的值,然后如果它是Closed,则将其他字段设为只读(或隐藏它们)。这是使用在EditForm.aspx上的内容编辑器Web部件中添加的JavaScript完成的。​​

var myChoiceField = SPUtility.GetSPField('Single Choice Field');
if (myChoiceField.GetValue() == 'Closed') {
    SPUtility.GetSPField('Field A').MakeReadOnly();
    SPUtility.GetSPField('Field B').MakeReadOnly();
    SPUtility.GetSPField('Field C').MakeReadOnly();
    // etc..
}

完全公开..这是我维护的开源库。我仅使用SharePoint 2007对其进行了测试,但它也可以与SharePoint 2010一起使用(遗憾的是我无法访问要测试的SharePoint 2010环境)。

答案 2 :(得分:1)

我会用两种方式攻击它:

  1. 工作流完成并将项目设置为“已关闭”后,您可以从父列表中断权限继承,并将列表项权限设置为只读。您可以在自定义工作流程中或作为工作流程或列表项目事件接收器执行此操作。
  2. 设置一个ItemUpdating List Item事件接收器,用于设置properties.Status = SPEventReceiverStatus.CancelWithError如果状态为Closed。
  3. 就个人而言,我更喜欢第一个选项,因为它符合SharePoint的安全理念,即不让用户尝试他们没有权限做的事情。以下代码是在列表项上设置只读权限的示例:

    item.BreakRoleInheritance(false);
    SPRoleDefinition role = web.RoleDefinitions.GetByType(SPRoleType.Reader);
    SPRoleAssignment assignment = new SPRoleAssignment(web.AssociatedVisitorGroup);
    assignment.RoleDefinitionBindings.Add(role);
    item.RoleAssignments.Add(assignment);
    

答案 3 :(得分:0)

尝试创建事件接收器并处理删除事件。

答案 4 :(得分:0)

Idea(未经测试):将自定义内容类型添加到列表中(这将允许您控制以后以管理员身份进行编辑)。工作流程切换到自定义CT,项目是"关闭"。将项目数据的只读视图添加到EditForm.aspx,并在Designer中添加类"隐藏"到你的只读视图。然后在页面上的CDWP中添加自定义css,用于类.hidden display:none。然后使用JavaScript根据CT添加/删除该类,以便只读视图仅对自定义CT可见,而编辑wp对所有其他视图都可见。

或者使用自定义InfoPath表单根据状态切换到只读视图...