所以我正在尝试在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.";
}
}
我尝试过使用ItemUpdated
和ItemUpdating
事件接收器,当我调试时,我看到事件接收器被调用,但是beforeStatus
和{{1在这两种情况下,都会从项目中获取afterStatus
。
那么,如何在正确更新之前和之后获取项目字段的值?提前谢谢!
注意:字段的内部和显示名称均为null
。
答案 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
获取新值。
虽然错误消息对用户来说很糟糕:
我现在会尝试解决这个问题:)