SPItemEventReceiver 提供 BeforeProperties / AfterProperties 取得欄位變更前後值,但 SDK 指出:「列表項目事件不公開 BeforeProperties」。實測驗證各事件行為差異。
| 事件 | BeforeProperties | AfterProperties | ListItem |
|---|---|---|---|
| ItemAdding | 無值 | 新值 | 空 |
| ItemAdded | 無值 | 新值 | 新值 |
| ItemUpdating | 無值 | 變更值 | 舊值 |
| ItemUpdated | 無值 | 變更值 | 新值 |
| ItemDeleting | 無值 | 無值 | 舊值 |
| ItemDeleted | 無值 | 無值 | 空 |
| 事件 | BeforeProperties | AfterProperties | ListItem |
|---|---|---|---|
| ItemAdding | 無值 | 無值 | 空 |
| ItemAdded | 無值 | 無值 | 新值 |
| ItemUpdating | 舊值 | 變更值 | 舊值 |
| ItemUpdated | 舊值 | 變更值 | 新值 |
| ItemDeleting | 無值 | 無值 | 舊值 |
| ItemDeleted | 無值 | 無值 | 空 |
錯誤寫法(文件庫適用、列表失效):
if (properties.BeforeProperties["column"] != properties.AfterProperties["column"]) { ... }
正確寫法(列表適用):
// ItemUpdating 同步事件中
if (properties.ListItem["column"] != properties.AfterProperties["column"])
{
properties.Cancel = true;
properties.ErrorMessage = "該欄不允許修改";
}
原理:列表的 ListItem 保有舊值,AfterProperties 為新值,兩者比對即可偵測變更。