一个简单的document library event handler
这是一个简单的eventhandler,就是在document lirary中Insert和Update一个Item时,更改一个Field的值为这个文件的URL.
编写doucment library的eventhandler需要继承IListEventSink 接口
代码如下:
1
public class DocumentLibraryEvent : IListEventSink
2
{
3
IListEventSink Members#region IListEventSink Members
4
5
public void OnEvent(SPListEvent listEvent)
6
{
7
if (listEvent.Type == SPListEventType.Insert || listEvent.Type == SPListEventType.Update)
8
{
9
SPWeb web = listEvent.Site.OpenWeb();
10
if (web.Lists[listEvent.ListID].Fields.ContainsField("Selected"))
11
{
12
//string colName = web.Lists[listEvent.ListID].Fields["Selected"].InternalName;
13
14
string urlVal = listEvent.WebUrl + "/" + listEvent.UrlAfter;
15
//listEvent.PropertiesAfter[colName] = urlVal;
16
SPFile file = web.GetFile(listEvent.UrlAfter);
17
18
while (file.CheckOutStatus != SPFile.SPCheckOutStatus.None)
19
{
20
System.Threading.Thread.Sleep(1000);
21
file = web.GetFile(listEvent.UrlAfter);
22
}
23
24
file.Item["Selected"] = urlVal;
25
file.Item.Update();
26
}
27
}
28
}
29
30
#endregion
31
}
public class DocumentLibraryEvent : IListEventSink 2

{3

IListEventSink Members#region IListEventSink Members4

5
public void OnEvent(SPListEvent listEvent)6

{7
if (listEvent.Type == SPListEventType.Insert || listEvent.Type == SPListEventType.Update)8

{9
SPWeb web = listEvent.Site.OpenWeb();10
if (web.Lists[listEvent.ListID].Fields.ContainsField("Selected"))11

{12
//string colName = web.Lists[listEvent.ListID].Fields["Selected"].InternalName;13

14
string urlVal = listEvent.WebUrl + "/" + listEvent.UrlAfter;15
//listEvent.PropertiesAfter[colName] = urlVal;16
SPFile file = web.GetFile(listEvent.UrlAfter);17

18
while (file.CheckOutStatus != SPFile.SPCheckOutStatus.None)19

{20
System.Threading.Thread.Sleep(1000);21
file = web.GetFile(listEvent.UrlAfter);22
}23

24
file.Item["Selected"] = urlVal;25
file.Item.Update();26
}27
}28
}29

30
#endregion31
}这段代码很好理解,判断是Insert和Update并且包含这个字段,然后获取url修改field的值。
下面这段代码主要为解决新建一个文档时,去修改Selected字段值,抛出被checkout的异常。
这段代码来自Jan Tielens' Bloggings
1
2
while (file.CheckOutStatus != SPFile.SPCheckOutStatus.None)
3
{
4
System.Threading.Thread.Sleep(1000);
5
file = web.GetFile(listEvent.UrlAfter);
6
}

2
while (file.CheckOutStatus != SPFile.SPCheckOutStatus.None)3

{4
System.Threading.Thread.Sleep(1000);5
file = web.GetFile(listEvent.UrlAfter);6
}
这段代码可以实现需求,但是总感觉不美。
似乎是应该这样去修改:
listEvent.PropertiesAfter[colName] = urlVal;
但我尝试了,没有作用!
部署:
1)首先,要打开document library的enventhandler,在central administration->Application Management
->Web Application General Settings
找到想要更改的Web Application,设置
2)把编译后的dll放入GAC
3)到一个想添加事件的document library->Settings->Advanced Settings添加程序集和类
这样就OK了,我们的事件就会被执行了。
