在写list的eventhandle的时候遇到一些困难,这个文档主要是解决困难的心得。
1、eventhandle的注册可以通过编码的方式和feature的方式,两个都使用,感觉feature更好用一些,一度被<Receivers ListTemplateId="100">的 ListTemplateId迷惑,可以通过在SDK中查找 ListTemplateId查看相关值(1、ListTemplate Element (Site) ;2、SPListTemplateType Enumeration)
编码的方式在布置的时候会有“无权访问”之类的错误,其实我已经从list上面删除,并且从GAC卸载了。目前还不知道为什么。
2、调试,我采取的方法比较笨,一行一行的跟踪,用了一个写日志的法子,在事件代码里一定要try...catch,因为可想而知这种事件,一定在系统里错误处理了,根本不会报出错误来,只有自己捕捉放到日志里面跟踪。
3、在itemadding中properties.listitem是空值,也是,这个玩意还没添加呢,所以不能通过properties.listitem.listitems.list来获取list,我用的法子是web.Lists[properties.ListId];
4、同时要注意listItem、users、groups的取值范围,比如users和siteusers这些东西,list.items和web的items等等。
5、AfterProperties[value]或者beforeProperties[value]value不是你字段的displaytitle,是你的字段的真实名称,不废话了提供两个小函数,一看就明白了:
public string GetPropertyFieldName(SPItemEventProperties properties, String itemDisplayName)
{
SPList sList = myweb.Lists[properties.ListId];
return sList.Fields[itemDisplayName].InternalName;
}
public object GetPropertyValue(SPItemEventProperties properties, String itemDisplayName)
{
string FieldName = GetPropertyFieldName(properties, itemDisplayName);
return properties.AfterProperties[FieldName];
}
6、在手工添加数据时this.DisableEventFiring();//this.EnableEventFiring();要注意添加不然会发生连锁事件。
7、目前测试的结过AfterProperties[value]等返回的基本都是string,获取一些值就很简单,不过要是对象的话,自己动手转换吧。
好,先写到这里,开发eventhandle感觉还是调试问题比较烦,还有就是那位大神写一个校验框架啊(通过XML),编码的过程轻松一点点。
可能输出换成C:\WINDOWS\assembly,再用w3wp.exe附加进程可能调试容易些?没试过,还是用写日志的法子吧,也还不错。