当前位置: 首页>>建站开发>>正文


SharePoint列表中的Read-only列

webfans 建站开发 , , 去评论

问题描述

我想在我发送给用户的”Request Approval” Nintex工作流任务中创建一个read-only列。我做了以下事情:

  1. 在我的列表中创建了一个列。字段名称:“Guideline”

  2. 在默认视图中,不显示此列

  3. 创建的内容类型包含指南列。

  4. 内容类型名称:“Workflow task”

  5. 这是默认的内容类型

  6. 现在,当用户批准某个项目时,他会看到“guideline”字段

但是,该字段处于编辑模式,用户可以向此字段添加信息。我想阻止用户编辑此字段!

我该怎么办?

最佳解决方法

为了在SharePoint中实现真正的列级安全性,我使用两个列表并将列创建为查找。这样,我可以在查找源上设置特定权限(例如,只读或甚至拒绝访问)。

它需要比单个列表更多的努力,但据我所知,这是没有server-side代码的唯一方法。但是,如果只有一个列表,意味着如果我们只需要一个列表而不能添加任何其他列表,那么我们就会遇到问题。

次佳解决方法

您可以使用项目事件接收器来阻止值被更改。像这样的东西:

public class EventReceiver1 : SPItemEventReceiver
{
    public override void ItemUpdating(SPItemEventProperties properties)
    {
        if (properties.ListItem["Guideline"] != properties.AfterProperties["Guideline"])
        {
            properties.Cancel = true;
            properties.ErrorMessage = "Guideline is a read-only field";
        }
    }
}

第三种解决方法

我完全同意@Marc D Anderson和@Matt Weimer。您可以使用JavaScript来帮助UI演示,并使用事件接收器来强制执行值server-side。

至于JavaScript部分,我建议看看SPUtility.js(完全披露,我维护这个开源库)。它允许您执行以下操作:

<script type="text/javascript">
function InitializeMyForm()
{
    SPUtility.GetSPField('Guideline').MakeReadOnly();
    // more code here...
}
_spBodyOnLoadFunctionNames.push("InitializeMyForm");
</script>

这可以放在表单上的内容编辑器Web部件中(有关更多选项,请参阅installation page)。

第四种方法

看看这个工具,它有助于使列只读或隐藏http://splistsecurity.codeplex.com/

第五种方法

您可以使用SharePoint Designer自定义editform.aspx。请查看下面的文章,了解如何执行此操作。

http://office.microsoft.com/en-us/sharepoint-designer-help/create-a-custom-list-form-HA010119111.aspx

“在步骤6中 – 在要创建的表单类型下,指示是否要创建新项目表单,编辑项目表单或显示项目表单。”

您将选择“编辑项目表单”。创建此表单后,请浏览源代码并找到显示”Guideline”字段的HTML代码段。您可以对此部分进行评论,以防止用户进行编辑。或者将编辑模式更改为”Display”以向用户显示只读内容。

最后的想法 – 如果指南字段中的内容没有针对每个项目进行更改,只需将其作为工作流任务通知中的静态文本。不要将其创建为字段。这样,用户将看到指南文本作为批准通知的一部分。

第六种方法

最重要的是,SharePoint中没有“read-only列”这样的东西。您可以屏蔽它,隐藏它等等,但可能仍有一个地方(通常是数据表视图是罪魁祸首),用户可以在其中输入数据。

自定义表单是脚本可靠性的最佳方法。 (任何了解我的人都知道我喜欢使用脚本!)如果使用脚本保护列并且脚本因任何原因而无法运行,则该列将不受保护。 (这可能只是由于你自己在脚本中的错误。)

您可以在SharePoint Designer或托管代码中自定义表单。

第七种方法

如果要将列描述为要素中的网站列,则可以添加ReadOnly属性(设置为TRUE)以及以下属性:

PITarget="" PrimaryPITarget="" PIAttribute="" PrimaryPIAttribute="" Node=""

为了使站点列ReadOnly并且只能通过代码更新。我没有测试过这个,看看是否可以使用DataSheet视图覆盖它;但我想不会。

第八种方法

我已经探索了另一种方法,它使用对象模型来设置ReadOnlyField属性(请参阅:http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfield.readonlyfield.aspx)。

SPList list = web.Lists["Your list name"];
SPField guideline = list.Fields["Guideline"];
guideline.ReadOnlyField = true;
guideline.Update();  

完成对某个字段的操作后,它将不再显示新项目并编辑项目表单。这里的缺点是当您向列表中添加新项目并且您想要为read-only列设置初始值时。您需要将ReadOnlyField属性的值更改回false,添加项,然后将ReadOnlyField属性设置回true。如果更改read-only字段的值,则需要相同的过程。此外,我测试了当您尝试通过将此属性设置为true的代码更改值时会发生什么。它不会产生任何异常或错误,只会丢弃新值。

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2691.html,转载请务必附带本地址声明。