日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【飞秋】在SPItemEventReceiver中使用BeforeProperties和AfterProperties

發布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【飞秋】在SPItemEventReceiver中使用BeforeProperties和AfterProperties 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正如你所知道的,事件接收器(EventHandler)非常強大,可以掛在許多SharePoint事件上。它們可以應用于功能(Feature)事件,如FeatureActivated,列表事件,如FieldAdded,等等。然而,其中我們最常用的還是SPItemEventReceiver中的一系列接收器。通過繼承該類,我們可以把自己的代碼掛接在列表項或文檔庫文檔上發生的一系列事件上。

當你利用這些事件時,就很快會發現存在前(同步)后(異步)兩種事件。其方法的后綴分別為“ing”(比如,ItemAdding)和“ed”(比如,ItemAdded),分別代表了變更發生前調用和發生后調用。這些都是最基本的東西。

接下來,當你更深入時甚至發現,你可以提取變更前和變更后的狀態變化。比如,我們可以掛接到一個文檔庫的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 }

對于文檔庫而言,該代碼運行良好。然而,你應該知道,BeforeProperties哈希表對于列表項來說并不公開。用SDK中的原話說:“對于文檔,Before 和 After 屬性可為發布事件(例如 ItemUpdated)提供保證,但 Before 屬性不能用于有關列表項的發布事件。”。

當他們說“不能用于有關列表項的發布事件”時,意思是說在后事件(比如 ItemUpdated,ItemDeleted等)中不可用嗎?這里詞語表述不是很清楚,因此我決定花點時間測試一下各種常見事件(像添加,修改和刪除)與列表和庫的組合。每個測試包括了添加一個新項,編輯該項,然后刪除該項。下面是對列表的測試結果:

列表 BeforeProperties AfterProperties properties.ListItem
ItemAdding 沒值 新值 空
ItemAdded 沒值 新值 新值
ItemUpdating 沒值 更改的值 老值
ItemUpdated 沒值 更改的值 更改的值
ItemDeleting 沒值 沒值 老值
ItemDeleted 沒值 沒值 空

“沒值”的意思是該欄的值在哈希表中不可用。

“新值”的意思是該欄當前的值是可用的。

“更改的值”的意思是該欄修改后的值是可用的。

“老值”的意思是該欄在修改前的值是可用的。

下面是對于文檔庫的測試結果:

文檔庫 BeforeProperties AfterProperties properties.ListItem
ItemAdding 沒值 沒值? 空
ItemAdded 沒值 沒值 新值
ItemUpdating 老值 更改的值 老值
ItemUpdated 老值 更改的值 更改的值
ItemDeleting 沒值 沒值 老值
ItemDeleted 沒值 沒值 空

Properties.ListItem是指列表項在事件中當前的值。空表示該項不可用。通過我的分析得到如下結論:

毫不奇怪,我們在ItemAdding(在項被添加前)和ItemDeleted(在項被刪除后)得到的是空值。之前Lshai Sagi也證明過這一點。

正如SDK中記載的,對于列表項事件不公開BeforeProperties。

對于列表項而言ItemAdding 和ItemAdded正確返回了AfterProperties的值,而對于庫文件則無效。這一點很有意思。

通過之前的實驗發現,在ItemDeleted中沒有任何可用的值。這也很明顯,一旦刪除了就徹底消失了。

因此,如果再回到我們原來的問題上,如何防止用戶在列表項的事件中修改某一欄的值?對于列表而言,你可以看到,如果掛在ItemUpdating事件上,我們可以對當前列表項的值(properties.ListItem)和AfterProperties的值進行比較。代碼如下:


view sourceprint?1 if (properties.ListItem["column"] != properties.AfterProperties["column"])?

2 {?

3???? properties.Cancel = true;?

4???? properties.ErrorMessage = "該欄不允許修改";?

5 }

本文中我們為你使用列表和文檔庫前后事件提出一些好的建議。希望能看到你的更好的想法或反饋。

?

參考資料

關注技術文章飛秋:http://www.freeeim.com/,24小時專業轉載。

總結

以上是生活随笔為你收集整理的【飞秋】在SPItemEventReceiver中使用BeforeProperties和AfterProperties的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。