Sharepoint 2010 禁止用户在文档库的第一级(根)目录上传文件

首先,什么叫文档库的第一级(根)目录。当我们打开文档库时,然后就点击Ribbon中的"上载单个文件",此时就是在第一级目录的上传文件。我要做的就是禁止用户在这里上传文档,只允许新建文件夹。看下图,图片20100-12-02 151718就是在第一级目录

我首先想到的方法是,根据用户是否在文档库第一级目录来隐藏Ribbon中的"上载单个文件"及"新建文档"命令项(可参考http://blog.csdn.net/sygwin_net/article/details/6789973)。这样得到的结果是,用户打开文档库时(在第一级目录时),也就看不到这两项命令了。可这样并未完全控制住。因为我只是禁止在第一级目录上传或新建文件,在非第一级目录还是要用户上传文件的,此时用户可以在上传文档窗口,更改上传文件的位置,如下图(选择文件夹按钮):

下面我就想用事件接收器的ItemAdding来控制。思路很简单,用户上传文件时,判断上传文件的路径是否在第一级目录即可。代码如下:

public override void ItemAdding(SPItemEventProperties properties)
{
base.ItemAdding(properties);
if (properties.BeforeUrl == properties.AfterUrl && properties.BeforeUrl.IndexOf("/") == properties.BeforeUrl.LastIndexOf("/"))
{
properties.Cancel = true;
properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl;
properties.RedirectUrl = "/_layouts/error.aspx?ErrorText="+Microsoft.SharePoint.Utilities.SPEncode.UrlEncode("禁止在根目录上传文件!");
}
}

说明:在ItemAdding事件里,此时文档还未上传到库里,所以properties的BeforeProperties,AfterProperties及ListItem均为null。也就不能用了。

而对于BeforeUrl和AfterUrl属性,它有以下特点:

如果上传文档,不管在哪级目录下,两者相等,比如均为:DocLib/2011-12-02_154248.jpg。
如果新建文件夹,不管在哪级目录下,BeforeUrl均为空,而AfterUrl则是文件夹的路径,比如:DocLib/aa

这样根据properties.BeforeUrl == properties.AfterUrl判断用户是上传文件还是新建文件夹;
根据properties.BeforeUrl.IndexOf("/") == properties.BeforeUrl.LastIndexOf("/")判断用户是否在第一级目录里上传文件。因为在第一级目录上传文件BeforeUrl的值,类似为:DocLib/2011-12-02_154248.jpg
在第二级目录上传文件BeforeUrl的值,类似为:DocLib/test/2011-12-02_154248.jpg
这样根据"/"的索引位置就可以判断是否在第一级目录里上传文件。

参考:http://sharepointserved.blogspot.com/2011/05/to-prevent-users-from-creating-folders.html

原文地址:https://www.cnblogs.com/sygwin/p/2279182.html