SharePoint中的EventReceiver 之三 编写Event Handler
编写一个event handler来仅在满足某种条件的时候才允许某个动作的执行, 是非常常见的. 比如说, 你可以写一个ItemDelete handler, 来在当前用户不是站点管理员时取消掉删除动作.
public class VendorItemEventReceiver : SPItemEventReceiver { public override void ItemDeleting(SPItemEventProperties properties) { if (!properties.OpenWeb().CurrentUser.IsSiteAdmin) { properties.Status = SPEventReceiverStatus.CancelWithError; properties.ErrorMessage = "Vendor can only be deleted by site administrator"; properties.Cancel = true; } } }
为before event编写event handler, 在其中添加某些合法性判断的逻辑也是非常平常的. 比如说, 假设一个场景, 其中你想要添加到Vendor列表的item包含一个至少7个字符长的电话号码. 所以, 你必须提供一个ItemAdding的event handler还有一个ItemUpdating的event handler来执行validation的逻辑. 下面的例子展现了一个如何创建一个这样的event handler, 还有个叫做PhoneIsValid的helper方法, 这样你就能够在一个方法中来处理所有的validation的逻辑了.
public class VendorItemEventReceiver : SPItemEventReceiver { // provide method with validation logic private bool PhoneIsValid(string Phone) { if ((Phone == null) || (Phone.Length < 7)) return false; else return true; } // provide error message const string PhoneInvalidErrorMessage = "VALIDATION ERROR: Phone must be at least 7 digits."; public override void ItemAdding(SPItemEventProperties properties) { // validate Phone column for new vendor item string Phone = properties.AfterProperties["WorkPhone"].ToString(); if (!PhoneIsValid(Phone)) { properties.Status = SPEventReceiverStatus.CancelWithError; properties.ErrorMessage = PhoneInvalidErrorMessage; properties.Cancel = true; } } public override void ItemUpdating(SPItemEventProperties properties) { // validate Phone column for update to vendor item string Phone = properties.AfterProperties["WorkPhone"].ToString(); if (!PhoneIsValid(Phone)) { properties.Status = SPEventReceiverStatus.CancelWithError; properties.ErrorMessage = PhoneInvalidErrorMessage; properties.Cancel = true; } } }
注意ItemAdding和ItemUpdating这两个event handler必须获得用户想要保存的WorkPhone列的值. 这些event handler方法通过使用SPItemEventProperties参数的AfterProperties属性来获得这个column的值. AfterProperties 允许你使用field的underlying name来访问正在被修改的item的column的值(不是DisplayName). 同样地, SPItemEventProperties 参数还暴露了一个叫做BeforeProperties 的属性, 这样你可以确定在column被修改之前的初始值.
before events典型地被用来做合法性验证, 而after events可以被用来保持数据完整性或者开启自定义的某些操作. 想象一个场景, 其中公司名必须都是大写字符. 在这个例子中, 我们会为after events写event handlers来在column的值被修改的任何时候重新格式化值.
public class CompanyItemEventReceiver : SPItemEventReceiver { // custom logic to format a field value private string FormatCompanyName(string value) { return value.ToUpper(); } public override void ItemAdded(SPItemEventProperties properties) { DisableEventFiring(); string CompanyName = properties.ListItem["Company"].ToString(); properties.ListItem["Company"] = FormatCompanyName(CompanyName); properties.ListItem.Update(); EnableEventFiring(); } public override void ItemUpdated(SPItemEventProperties properties) { DisableEventFiring(); string CompanyName = properties.ListItem["Company"].ToString(); properties.ListItem["Company"] = FormatCompanyName(CompanyName); properties.ListItem.Update(); EnableEventFiring(); } }
你应该注意到上面的例子中对方法DisableEventFiring 和EnableEventFiring的调用. 通过在event handler中禁用event handling, 你能够更新列表中的columns而不会引发额外的事件fire. 这对于防止递归行为是很有必要的, 要不然的话event handler会不断地激发自己.
译自:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律