我认为这会容易得多,但是我无法找到一种方法来确定我的事件处理程序中是否是文件的第一次检入..
你知道,我正在打破角色继承,并有选择地继承doc libs中文件的权限,但我希望在第一次签入文件时只执行一次。
我已经尝试在ItemAdded事件中为'SPListItem.Properties'添加一个条目,以指示该文件是否是新文件,但是当我执行“SPListItem.Update()”时它就会消失..
我玩过ItemCheckingIn和ItemCheckedIn事件没有成功......
我目前唯一的希望是在ContentType中添加一个SPField来指示是否有新文件,但我真的希望避免它...
任何想法????
请帮助我!
答案 0 :(得分: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();
时,它仍然是文件时间答案 1 :(得分:0)
所以我得到了一个解决方案。 对不起,我不能在这里发布代码,我没有在我的开发机器上访问互联网。 它对每个人都应该足够好。
解决方案: 在CheckingIn事件期间,我尝试使用SHAREPOINT \ system(“SPSecurity.RunWithElevatedPrivileges()”)访问该文件。在第一次办理登机手续时,该文件是新的,除上传者外其他用户无法访问。
因此,如果我无法使用SHAREPOINT \ system获取该文件,则表示它是新的,我将其Guid保存在EventHandlers类的字典中。
然后在CheckedIn事件中,我只检查字典是否包含当前项目的Guid,如果是的话 - 第一次检查,如果不包含 - 不首先登记。
当然,在我完成文件后,我从字典中删除了条目。
希望它有所帮助,如果您有任何问题,欢迎您提问:)