Sharepoint 更名为;修改为“;使用提升模式后的字段

Sharepoint 更名为;修改为“;使用提升模式后的字段,sharepoint,sharepoint-2013,spsite,Sharepoint,Sharepoint 2013,Spsite,我目前面临的一个问题是使用功能中使用的提升模式 我已经创建了一个自定义SharePoint安全角色(贡献角色,但没有删除权限)。 我的SharePoint功能的目标如下: 将文件上载到SP站点时,需要使用选定的元数据名称重命名文件名。上传文件时,第二个表单要求用户定义3或4个元数据 为了重命名该文件,我开发了以下代码: Public override void ItemAdded(SPItemEventProperties properties) { SPSecurity.RunWith

我目前面临的一个问题是使用功能中使用的提升模式

我已经创建了一个自定义SharePoint安全角色(贡献角色,但没有删除权限)。 我的SharePoint功能的目标如下:

将文件上载到SP站点时,需要使用选定的元数据名称重命名文件名。上传文件时,第二个表单要求用户定义3或4个元数据

为了重命名该文件,我开发了以下代码:

    Public override void ItemAdded(SPItemEventProperties properties)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
       {
CallFunctionToUpdate();
});
}


Public override void ItemUpdated(SPItemEventProperties properties)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
       {
CallFunctionToUpdate();
});
}



Public void CallFunctionToUpdate()
{
try
       {
        this.EventFiringEnabled = false;
              using (SPWeb newWeb = newSite.OpenWeb(_properties.RelativeWebUrl))
              {
SPListItem item = newWeb.Lists[_properties.ListId].GetItemById(_properties.ListItem.ID);
newFileName = FilenameManagementHelper.GenerateFilename(properties.ListItem);

                     currentName = properties.ListItem["Name"].ToString();
                     var extension = Path.GetExtension(currentName);

                     if (item["Title"] == null || item["Title"].ToString() != newFileName)
                     {
                        item["Title"] = newFileName;
item["Editor"] = new SPFieldUserValue(properties.OpenWeb(), properties.OpenWeb().CurrentUser.ID, properties.OpenWeb().CurrentUser.LoginName);
                            item.SystemUpdate();
                     }

                     if (currentName.Substring(0, currentName.Length - extension.Length) != newFileName)
                     {
                        SPList list = newWeb.Lists[_properties.List.Title];
                           string destUrl = list.RootFolder.Url + "/" + newFileName + extension;
SPFile fileToMove = list.Items[_properties.ListItemUniqueId].File;

                           SPFolder folder = newWeb.GetFolder(list.RootFolder.Url);
                           byte[] bin = fileToMove.OpenBinary();
                           folder.Files.Add(destUrl, bin, fileToMove.Properties, true);

fileToMove.Delete();                             newWeb.Lists[list.RootFolder.Url].Update();
                        }

                     }
}
       catch (Exception ex)
       {
           DocumentDiagnosticService.LogError(CategoryID.Error, string.Format("Error {0} for the file name - {1}", ex.Message, currentName));
}
       finally
       {
        this.EventFiringEnabled = true;
       }

}
SPList list = newWeb.Lists[_properties.List.Title];
string destUrl = list.RootFolder.Url + "/" + newFileName + extension;
SPFile fileToMove = list.Items[_properties.ListItemUniqueId].File;
SPFolder folder = newWeb.GetFolder(list.RootFolder.Url);
byte[] bin = fileToMove.OpenBinary();
SPUser author = fileToMove.Author;
folder.Files.Add(destUrl, bin, author, author, DateTime.Now, DateTime.Now);
fileToMove.Delete();                          
folder.Files.Add(destUrl, bin, fileToMove.Properties, author, author, DateTime.Now, DateTime.Now, true);
在重命名文件名之前,我正在更新字段(元数据)标题和编辑器。第二步将移动文件(带有与上传文件相关联的元数据和历史记录)

我使用提升模式是因为具有受限安全角色的用户无法删除。在开发的代码中,我移动重命名的文件并删除上传的旧文件

我找到了这种方法,因为我需要保持版本控制。不允许直接更新文件名(如标题),这样会丢失历史记录。例如:将上载一个文件,文件名将使用元数据更新。对于第一个版本,没有问题。上载具有相同元数据的第二个文件,因为已有同名文件,这将生成错误。使用Files.Add,将删除当前文件并保留历史记录

在这种情况下我的问题是:当用户上传文件时,字段Title和Editor被正确替换。然后移动文件、重命名字段名并删除旧版本。此时,“修改方式”字段将一直出现在SharePoint系统管理员中

我怎样才能将修改件保存在上传文件的人的姓名旁边

编辑:

使用以下代码:

SPList list = newWeb.Lists[_properties.List.Title];
string destUrl = list.RootFolder.Url + "/" + newFileName + extension;
SPFile fileToMove = list.Items[_properties.ListItemUniqueId].File;
SPFolder folder = newWeb.GetFolder(list.RootFolder.Url);
byte[] bin = fileToMove.OpenBinary();
folder.Files.Add(destUrl, bin, fileToMove.Properties, true);
fileToMove.Delete();     
允许我在上传期间移动选定元数据的文件。如果当前版本已经上传,但修改者是SysAdmin,我仍然有版本控制

使用以下代码:

    Public override void ItemAdded(SPItemEventProperties properties)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
       {
CallFunctionToUpdate();
});
}


Public override void ItemUpdated(SPItemEventProperties properties)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
       {
CallFunctionToUpdate();
});
}



Public void CallFunctionToUpdate()
{
try
       {
        this.EventFiringEnabled = false;
              using (SPWeb newWeb = newSite.OpenWeb(_properties.RelativeWebUrl))
              {
SPListItem item = newWeb.Lists[_properties.ListId].GetItemById(_properties.ListItem.ID);
newFileName = FilenameManagementHelper.GenerateFilename(properties.ListItem);

                     currentName = properties.ListItem["Name"].ToString();
                     var extension = Path.GetExtension(currentName);

                     if (item["Title"] == null || item["Title"].ToString() != newFileName)
                     {
                        item["Title"] = newFileName;
item["Editor"] = new SPFieldUserValue(properties.OpenWeb(), properties.OpenWeb().CurrentUser.ID, properties.OpenWeb().CurrentUser.LoginName);
                            item.SystemUpdate();
                     }

                     if (currentName.Substring(0, currentName.Length - extension.Length) != newFileName)
                     {
                        SPList list = newWeb.Lists[_properties.List.Title];
                           string destUrl = list.RootFolder.Url + "/" + newFileName + extension;
SPFile fileToMove = list.Items[_properties.ListItemUniqueId].File;

                           SPFolder folder = newWeb.GetFolder(list.RootFolder.Url);
                           byte[] bin = fileToMove.OpenBinary();
                           folder.Files.Add(destUrl, bin, fileToMove.Properties, true);

fileToMove.Delete();                             newWeb.Lists[list.RootFolder.Url].Update();
                        }

                     }
}
       catch (Exception ex)
       {
           DocumentDiagnosticService.LogError(CategoryID.Error, string.Format("Error {0} for the file name - {1}", ex.Message, currentName));
}
       finally
       {
        this.EventFiringEnabled = true;
       }

}
SPList list = newWeb.Lists[_properties.List.Title];
string destUrl = list.RootFolder.Url + "/" + newFileName + extension;
SPFile fileToMove = list.Items[_properties.ListItemUniqueId].File;
SPFolder folder = newWeb.GetFolder(list.RootFolder.Url);
byte[] bin = fileToMove.OpenBinary();
SPUser author = fileToMove.Author;
folder.Files.Add(destUrl, bin, author, author, DateTime.Now, DateTime.Now);
fileToMove.Delete();                          
folder.Files.Add(destUrl, bin, fileToMove.Properties, author, author, DateTime.Now, DateTime.Now, true);
如果已经有版本,请允许我移动文件并保留历史记录。我现在可以得到由上传的真实用户填写的Modified By字段,而不是系统管理员,但是在上传过程中我丢失了所选的元数据

谢谢大家的支持,


修理

使用
item.Update()
而不是
SystemUpdate()
。它应该保留登录用户的身份。

感谢您的支持。 我已使用以下代码解决了我的问题:

    Public override void ItemAdded(SPItemEventProperties properties)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
       {
CallFunctionToUpdate();
});
}


Public override void ItemUpdated(SPItemEventProperties properties)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
       {
CallFunctionToUpdate();
});
}



Public void CallFunctionToUpdate()
{
try
       {
        this.EventFiringEnabled = false;
              using (SPWeb newWeb = newSite.OpenWeb(_properties.RelativeWebUrl))
              {
SPListItem item = newWeb.Lists[_properties.ListId].GetItemById(_properties.ListItem.ID);
newFileName = FilenameManagementHelper.GenerateFilename(properties.ListItem);

                     currentName = properties.ListItem["Name"].ToString();
                     var extension = Path.GetExtension(currentName);

                     if (item["Title"] == null || item["Title"].ToString() != newFileName)
                     {
                        item["Title"] = newFileName;
item["Editor"] = new SPFieldUserValue(properties.OpenWeb(), properties.OpenWeb().CurrentUser.ID, properties.OpenWeb().CurrentUser.LoginName);
                            item.SystemUpdate();
                     }

                     if (currentName.Substring(0, currentName.Length - extension.Length) != newFileName)
                     {
                        SPList list = newWeb.Lists[_properties.List.Title];
                           string destUrl = list.RootFolder.Url + "/" + newFileName + extension;
SPFile fileToMove = list.Items[_properties.ListItemUniqueId].File;

                           SPFolder folder = newWeb.GetFolder(list.RootFolder.Url);
                           byte[] bin = fileToMove.OpenBinary();
                           folder.Files.Add(destUrl, bin, fileToMove.Properties, true);

fileToMove.Delete();                             newWeb.Lists[list.RootFolder.Url].Update();
                        }

                     }
}
       catch (Exception ex)
       {
           DocumentDiagnosticService.LogError(CategoryID.Error, string.Format("Error {0} for the file name - {1}", ex.Message, currentName));
}
       finally
       {
        this.EventFiringEnabled = true;
       }

}
SPList list = newWeb.Lists[_properties.List.Title];
string destUrl = list.RootFolder.Url + "/" + newFileName + extension;
SPFile fileToMove = list.Items[_properties.ListItemUniqueId].File;
SPFolder folder = newWeb.GetFolder(list.RootFolder.Url);
byte[] bin = fileToMove.OpenBinary();
SPUser author = fileToMove.Author;
folder.Files.Add(destUrl, bin, author, author, DateTime.Now, DateTime.Now);
fileToMove.Delete();                          
folder.Files.Add(destUrl, bin, fileToMove.Properties, author, author, DateTime.Now, DateTime.Now, true);

现在,我已经用正在上传的用户填写了Modified By值,元数据仍然存在,版本也在那里。

它没有改变。它始终是系统帐户。阅读MSDN文章。在我的案例中,似乎需要使用SystemUpdate;folder.Files.Add(destUrl、bin、author、author、DateTime.Now、DateTime.Now);而不是folder.Files.Add(destUrl、bin、fileToMove.Properties、true);结果是Modified By字段定义正确,但是我丢失了元数据的selected.Ok。不知道问题出在哪里。看看你们是否可以通过使用下一页中的替代提升机制来解决这个问题,这个机制仍然不起作用。我使用Files.Add函数中的其他属性做了另一个测试。我更新了我的问题。我想我将不得不审查代码或改变方法以满足要求。不知道怎么做。