Sharepoint 2010 以编程方式更新事件处理程序中的列表项

Sharepoint 2010 Programmatically Update List Item in Event Handler

背景
我们在 SharePoint 2007 环境中安装了自定义开发的 .WSP,并且一直在升级到 2010 的过程中。随着升级,自定义事件触发器不再起作用,因此尝试更新并使其在 2010 年起作用。但我 运行宁成一期。原来的开发人员已经不在了,我很幸运能够在没有太多 SP Dev 背景的情况下解决这个问题。

目标
当创建新的列表项时触发事件。在活动中,使用项目名称和 return url 创建共享文件夹,使用项目名称创建 wiki 页面并包含共享文档 link 和 return url到维基页面。第三部分是使用新文件夹 url 和 Wiki 页面 URL 更新新创建的列表项。

问题
我已经开始使用前两部分,但到目前为止无法使用新链接更新新创建的列表项。我能够得到 links。我已经尝试了所有用于更新列表的基本内容,但我没有成功地在网上找到这些内容。没有什么复杂的(或者我认为)。但代码包含在下面。服务器上没有安装 VS,所以无法 运行 调试模式,我无法直接访问服务器。当您创建项目时,没有 client/user 方面的错误。无法找到包含任何日志文件的日志文件,也就是说,如果脚本失败,它是否会收集错误。

事件启动

public class CreateWikiAndFolder : Microsoft.SharePoint.SPItemEventReceiver
{
    public override void ItemAdded(SPItemEventProperties properties)
    {
        try
        {
            //this.DisableEventFiring();
            base.EventFiringEnabled = false;
            string sUrlOfWikiPage = string.Empty;
            string sUrlOfNewFolder = string.Empty;
            string sSubsiteRUL = string.Empty;
            string sCurrentItemTitle = properties.ListItem["Title"].ToString();
            string sWikiListName = "TR Wikis";
            string sDocLibName = "Shared Documents";
            string sTRListID = "TR Status";

            if (sTRListID.ToUpper().Equals(properties.ListTitle.ToString().ToUpper()))
            {
                //Create the Folder
                sUrlOfNewFolder = CreateFolder(properties.ListItem.Web, sDocLibName, sCurrentItemTitle);

                //Create the Wiki
                string ItemDispFormUrl = String.Concat(properties.ListItem.Web.Url, "/", properties.ListItem.ParentList.Forms[PAGETYPE.PAGE_DISPLAYFORM].Url, "?ID=", properties.ListItem.ID.ToString());
                sUrlOfWikiPage = CreateWiki(properties.ListItem.Web, sWikiListName, sCurrentItemTitle, ItemDispFormUrl, sUrlOfNewFolder);


                //Update the current TR Item
                //Have tried. properties.ListItem["WikiURL"] = sUrlOfWikiPage + ", " + "Wiki";
                SPListItem myListItem = properties.ListItem;
                SPFieldUrlValue shareFolderURLValue = new SPFieldUrlValue();
                shareFolderURLValue.Description = "Shared Folder";
                shareFolderURLValue.Url = sUrlOfNewFolder ;
                myListItem["SharedFolder"] = shareFolderURLValue;

                //I've tried each one separate and together to no luck
                myListItem.UpdateOverwriteVersion();
                myListItem.Update();
                //properties.ListItem.UpdateOverwriteVersion();
            }
            base.EventFiringEnabled = true;  
        }
    }
}

请注意,这是我们升级需要解决的最后一件事。

成功了。我同时做了这两项,所以我不确定它是两者的组合还是只有其中一项。但是我删除了 myListItem.UpdateOverwriteVersion(); 行并包围了用 web.AllowUnsafeUpdates 更新的项目,之前设置为 true 然后回到 false 之后。

另请注意,您需要将 properties.ListItem 保存到它自己的 SPListItem 中,然后更新而不是尝试操纵 properties.ListItem["Attribute"] 中的值,然后更新 properties.ListItem.Update。 SharePoint 不允许后一种选择,因此您必须保存到一个独立的 SPListItem,然后修改和更新那个。这可能不是最好的 SharePoint 行话,但这是需要做的。