0

我认为这会容易得多,但是我无法在我的事件处理程序中找到一种方法来确定它是否是文件的第一次签入..

你看,我打破了角色继承,并有选择地继承了 doc libs 中文件的权限,但我希望只做一次,在文件的第一次签入期间。

我尝试在 ItemAdded 事件中向“SPListItem.Properties”添加一个条目,以指示该文件是否是新文件,但是当我执行“SPListItem.Update()”时它消失了..

我玩过 ItemCheckingIn 和 ItemCheckedIn 事件但没有成功......

目前我唯一的希望是向 ContentType 添加一个 SPField 以指示是否是新文件,但我真的希望避免它..

有任何想法吗????

请帮我!

4

2 回答 2

1

我建议不仅考虑系统帐户是否具有访问权限,而且还要考虑文件的签出日期是否与文件的创建日期相同。

public bool IsFirstCheckIn(SPListItem item)
{
    // Item not null!
    if (item != null)
    {
        SPSecurity.RunWithElevatedPrivileges(delegate
        {
            // Open privileged Site
            using (SPSite pSite = new SPSite(site.ID))
            {
                // Open privileged Web
                using (SPWeb pWeb = pSite.OpenWeb(web.ID))
                {
                    // Create privileged SharePoint-Objects
                    SPList pList = GetList(pWeb, list.ID);
                    SPListItem pItem = GetListItem(pList, item.UniqueId);

                    // Check the Item
                    if (pItem == null)
                    {
                        // Can't access
                        return true;
                    }
                    else if (pItem.File != null && pItem.File.CheckedOutByUser != null)
                    {
                        // If the Item's File and checked out User is set, check if checked out date is equal creation date
                        return (pItem.File.CheckedOutDate.ToLocalTime() == pItem.File.TimeCreated.ToLocalTime());
                    }
                }
            }            
        });    
    }

    return false;
}

使用系统账号,绝对是个好主意,否则授权设置会出问题。使用“本地时间”而不是“UTC-Time”,SharePoint 在存储时处理时区!

似乎,SharePoint 使用 UTF-FileTime 来存储文件的创建时间,但使用为 SPWeb 或 SPUser 定义的时区来存储基于“本地时间”的文件签出日期。

幸运的是,DateTime 值确实知道它是什么,并且可以在调用 ToLocalTime() 时将其转换为相同的“本地时间”。奇怪的是,在调用 ToUniversalTime(); 时它仍然是一个文件时间;

于 2013-07-15T09:35:25.483 回答
0

所以我有一个解决方案。对不起,我不能在这里发布代码,我的开发机器上无法访问互联网。它应该对每个人都足够好。

解决方案:在 CheckingIn 事件期间,我尝试使用 SHAREPOINT\system("SPSecurity.RunWithElevatedPrivileges()") 访问文件。在第一次签入期间,文件是新的,除了上传者之外的其他用户无法访问。

因此,如果我无法使用 SHAREPOINT\system 获取文件,则意味着它是新的,我将其 Guid 保存在 EventHandlers 类的字典中。

然后在 CheckedIn 事件中,我只需检查字典是否包含当前项目的 Guid,如果包含 - FIRST CHECK-IN,如果不包含 - NOT FIRST CHECK-IN。

当然,在我完成文件后,我会从字典中删除条目。

希望对你有帮助,有什么问题欢迎提问:)

于 2012-08-03T11:39:46.093 回答