无法取消CMSPUBLISHINGSITE#2中列表项事件接收器ItemDeleting方法中的删除

时间:2010-03-08 18:50:13

标签: c# sharepoint sharepoint-2010

使用SharePoint 2010 RC我遇到了使用事件接收器取消删除列表项的问题。我的代码正在触发,设置SPItemEventProperties的cancel属性,设置错误消息,并将错误返回给调用线程。这种方法在添加/更新方法中工作正常,但是,当在删除方法中使用时,我可以在调试器中查看代码,但该项仍然被移动到站点的回收站。

此外,我在从stsadm的“CMSPUBLISHINGSITE#2”模板创建的网站中看到此行为,但不是通过管理中心从“团队网站”模板创建的网站中看到此行为。

行为不当的代码如下:

public override void ItemDeleting(SPItemEventProperties properties)
{
    if (!(properties.UserLoginName == "SHAREPOINT\\system"))
    {
        try
        {
            throw new CreatorIdAliasingException("Please contact support if you feel a release web site has been inappropriately assigned to your organization.");
        }
        catch (CreatorIdAliasingException ex)
        {
            properties.Cancel = true;
            properties.ErrorMessage = ex.ToString();
            properties.InvalidateListItem();
            throw;
        }
    }
}

作为参考,相同的代码包含在ItemAdding方法中并按预期工作。

public override void ItemAdding(SPItemEventProperties properties)
        {
            base.ItemAdding(properties);
            if (!(properties.UserLoginName == "SHAREPOINT\\system"))
            {
                try
                {
                    throw new InvalidCreatorIdException("Please contact support to add a known URL to your list of release web sites.");
                }
                catch (InvalidCreatorIdException ex)
                {
                    properties.Cancel = true;
                    properties.ErrorMessage = ex.ToString();
                    properties.InvalidateListItem();
                    throw;
                }
            }
        }

1 个答案:

答案 0 :(得分:2)

我建议您不要将Exceptions用作业务逻辑的一部分。例外是昂贵的,只应在特殊情况下使用,而这些情况不是由普通逻辑处理的 相反,使用这样的东西:

public override void ItemDeleting(SPItemEventProperties properties)
{
  if (properties.UserLoginName.ToLower().CompareTo("sharepoint\\system") != 0)
  {
    properties.Cancel = true;
    properties.ErrorMessage = "Some error has occured....";
  }
}

顺便说一句,你在事件处理程序中抛出了一个额外的异常,这可能是你看到这种行为的原因。