在事件接收器中获取SharePoint ListItem的After和Before属性

时间:2013-09-13 12:18:45

标签: c# sharepoint event-receiver

所以我正在尝试在SharePoint 2010列表上完成此类功能:

我的列表中有一个类型选择字段,它有7个值,我希望用户不能将该字段的值从值2,3,4,5,6,7更改为值1。

我为该列表编写了一个事件接收器,这是我的代码:

public override void ItemUpdated(SPItemEventProperties properties)
   {
       base.ItemUpdated(properties);

       string beforeStatus = properties.BeforeProperties["Status"].ToString();
       string afterStatus = properties.AfterProperties["Status"].ToString();

       if (beforeStatus != "1stValue" && afterStatus == "1stValue")
       {
           properties.Cancel = true;
           properties.ErrorMessage = "This isn't allowed.";
       }
   }

我尝试过使用ItemUpdatedItemUpdating事件接收器,当我调试时,我看到事件接收器被调用,但是beforeStatus和{{1在这两种情况下,都会从项目中获取afterStatus

那么,如何在正确更新之前和之后获取项目字段的值?提前谢谢!

注意:字段的内部和显示名称均为null

2 个答案:

答案 0 :(得分:4)

使用ItemUpdating事件,然后afterproperties包含更改的值,ListItem包含字段的原始值。

Here您可以找到每个事件中可用的属性信息。

如何编辑列表项也很重要。如果通过SharePoint默认编辑表单,所有列都存在于afterproperties集合中,但如果您从自定义代码(例如webpart,事件接收)编辑项目,则该集合中仅存在更新的列。

编辑:对于外观漂亮的错误,您可以将用户重定向到自定义错误页面(您必须创建)

properties.Cancel = true;
properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl; 
properties.RedirectUrl = "/_layouts/MySolution/CustomErrorPage.aspx?Error=" + errorMessage;

答案 1 :(得分:1)

我自己找到了解决方法:

根据此article,我发现如果我想同时获取旧值和新值,我必须使用ItemUpdating事件接收器并使用properties.ListItem获取旧值并properties.AfterProperties获取新值。

虽然错误消息对用户来说很糟糕:error

我现在会尝试解决这个问题:)