【飞秋】在SPItemEventReceiver中使用BeforeProperties和AfterProperties
正如你所知道的,事件接收器(EventHandler)非常強大,可以掛在許多SharePoint事件上。它們可以應(yīng)用于功能(Feature)事件,如FeatureActivated,列表事件,如FieldAdded,等等。然而,其中我們最常用的還是SPItemEventReceiver中的一系列接收器。通過繼承該類,我們可以把自己的代碼掛接在列表項或文檔庫文檔上發(fā)生的一系列事件上。
當你利用這些事件時,就很快會發(fā)現(xiàn)存在前(同步)后(異步)兩種事件。其方法的后綴分別為“ing”(比如,ItemAdding)和“ed”(比如,ItemAdded),分別代表了變更發(fā)生前調(diào)用和發(fā)生后調(diào)用。這些都是最基本的東西。
接下來,當你更深入時甚至發(fā)現(xiàn),你可以提取變更前和變更后的狀態(tài)變化。比如,我們可以掛接到一個文檔庫的ItemUpdating事件上,來阻止用修改某個特定的字段。其代碼大致如下:
?
view sourceprint?1 public override void? ItemUpdating(SPItemEventProperties properties)?
2 {?
3????? if (properties.BeforeProperties["column"] != properties.AfterProperties["column"])?
4???? {?
5???????? properties.Cancel = true;?
6???????? properties.ErrorMessage = "該欄不允許修改";?
7???? }?
8 }
對于文檔庫而言,該代碼運行良好。然而,你應(yīng)該知道,BeforeProperties哈希表對于列表項來說并不公開。用SDK中的原話說:“對于文檔,Before 和 After 屬性可為發(fā)布事件(例如 ItemUpdated)提供保證,但 Before 屬性不能用于有關(guān)列表項的發(fā)布事件。”。
當他們說“不能用于有關(guān)列表項的發(fā)布事件”時,意思是說在后事件(比如 ItemUpdated,ItemDeleted等)中不可用嗎?這里詞語表述不是很清楚,因此我決定花點時間測試一下各種常見事件(像添加,修改和刪除)與列表和庫的組合。每個測試包括了添加一個新項,編輯該項,然后刪除該項。下面是對列表的測試結(jié)果:
列表 BeforeProperties AfterProperties properties.ListItem
ItemAdding 沒值 新值 空
ItemAdded 沒值 新值 新值
ItemUpdating 沒值 更改的值 老值
ItemUpdated 沒值 更改的值 更改的值
ItemDeleting 沒值 沒值 老值
ItemDeleted 沒值 沒值 空
“沒值”的意思是該欄的值在哈希表中不可用。
“新值”的意思是該欄當前的值是可用的。
“更改的值”的意思是該欄修改后的值是可用的。
“老值”的意思是該欄在修改前的值是可用的。
下面是對于文檔庫的測試結(jié)果:
文檔庫 BeforeProperties AfterProperties properties.ListItem
ItemAdding 沒值 沒值? 空
ItemAdded 沒值 沒值 新值
ItemUpdating 老值 更改的值 老值
ItemUpdated 老值 更改的值 更改的值
ItemDeleting 沒值 沒值 老值
ItemDeleted 沒值 沒值 空
Properties.ListItem是指列表項在事件中當前的值。空表示該項不可用。通過我的分析得到如下結(jié)論:
毫不奇怪,我們在ItemAdding(在項被添加前)和ItemDeleted(在項被刪除后)得到的是空值。之前Lshai Sagi也證明過這一點。
正如SDK中記載的,對于列表項事件不公開BeforeProperties。
對于列表項而言ItemAdding 和ItemAdded正確返回了AfterProperties的值,而對于庫文件則無效。這一點很有意思。
通過之前的實驗發(fā)現(xiàn),在ItemDeleted中沒有任何可用的值。這也很明顯,一旦刪除了就徹底消失了。
因此,如果再回到我們原來的問題上,如何防止用戶在列表項的事件中修改某一欄的值?對于列表而言,你可以看到,如果掛在ItemUpdating事件上,我們可以對當前列表項的值(properties.ListItem)和AfterProperties的值進行比較。代碼如下:
view sourceprint?1 if (properties.ListItem["column"] != properties.AfterProperties["column"])?
2 {?
3???? properties.Cancel = true;?
4???? properties.ErrorMessage = "該欄不允許修改";?
5 }
本文中我們?yōu)槟闶褂昧斜砗臀臋n庫前后事件提出一些好的建議。希望能看到你的更好的想法或反饋。
?
參考資料
關(guān)注技術(shù)文章飛秋:http://www.freeeim.com/,24小時專業(yè)轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的【飞秋】在SPItemEventReceiver中使用BeforeProperties和AfterProperties的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VTK修炼之道15:图像处理_显示(vt
- 下一篇: VTK修炼之道16:图像处理_窗口分割和