1

所以我试图在我的 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事件接收器,当我调试时,我看到事件接收器 get 被调用,但是在这两种情况下都是从项目中beforeStatus获取afterStatus的。null

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

注意:字段的内部名称和显示名称都是Status.

4

2 回答 2

4

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

在这里,您可以找到每个事件中可用的属性的信息。

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

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

properties.Cancel = true;
properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl; 
properties.RedirectUrl = "/_layouts/MySolution/CustomErrorPage.aspx?Error=" + errorMessage;
于 2013-09-13T12:43:25.427 回答
1

我自己找到了解决方案:

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

尽管错误消息对用户来说看起来很糟糕:错误

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

于 2013-09-13T12:41:22.197 回答