使用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;
}
}
}
答案 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....";
}
}
顺便说一句,你在事件处理程序中抛出了一个额外的异常,这可能是你看到这种行为的原因。