【问题标题】:Sharepoint 2007 - is there a way to determine if first check-in of file?Sharepoint 2007 - 有没有办法确定是否首先签入文件?
【发布时间】:2012-07-30 19:19:25
【问题描述】:

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

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

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

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

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

有什么想法吗????

请帮助我!

【问题讨论】:

  • 作为plan B,您能检查一下该项目是否有任何以前的版本吗?这样您就可以确定是否第一次签入,例如sharepoint.stackexchange.com/questions/32365/…
  • 嘿,感谢您的快速回答,但是我不能保证在文档库中启用了版本 :((
  • 啊,是的,好点。忘记了版本控制是“打开”功能,而不是强制性的。该死的:(

标签: c# sharepoint-2007 moss checkin splistitem


【解决方案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 时间”,SharePoint 在存储时处理时区!

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 2018-09-06
      • 2010-09-12
      • 2011-08-26
      • 2015-07-28
      • 2017-11-04
      相关资源
      最近更新 更多