这里的表单指的是列表默认的新建界面和编辑界面,在点击“确定”之后实际上是可以触发一段我们自定义的代码的,比如跳转页面、做一些其他操作等事情。(虽然跳转页面可以通过url中的Source来做,但是我们往往需要跳转时url加上当前列表条目的ID,不过新建页面中是拿不到条目ID的……)
添加表单事件的方法很容易,不过没有见到网上有任何文章说这件事 -.-
在SPFormContext中使用OnSaveHandler属性就可以挂载一个EventHandler了,所以我们可以在表单页面中加入如下代码(通过WebPart或者自定义字段):
1
protected
override
void
OnInit(EventArgs e)
2
{
3
base
.OnInit(e);
4
//
add save handler
5
if
(SPContext.Current.FormContext.FormMode
==
SPControlMode.New)
6
SPContext.Current.FormContext.OnSaveHandler
+=
new
EventHandler(MyHandler);
7
}
通过Reflector,我们可以看到保存列表条目的那个确定按钮“SaveButton”在保存时所做的操作,如果当前表单中有SaveHandler的话,则不会自动保存该条目。换句话说,我们需要在代码里面自动做这件事,不过也很容易,利用SaveButton的静态方法SaveItem:
1
protected
void
MyHandler(
object
sender, EventArgs e)
2
{
3
string
checkInComment
=
Page.Request.QueryString[
"
CheckInComment
"
];
4
if
(checkInComment
==
null
) checkInComment
=
""
;
5
SaveButton.SaveItem(SPContext.Current,
false
, checkInComment);
6
7
//
do custom actions, now we can get the item id!
8
if
(SPContext.Current.FormContext.FormMode
==
SPControlMode.New)
9
Page.Redirect(
"
some url.aspx?ID=
"
+
SPContext.Current.ListItem.ID.ToString(),
true
);
10
}
通过在自定义字段中使用,可以用这种方法实现一些功能(在自定义字段控件中可以直接用this.ControlMode代替FormMode)。
不过这种方法有一个缺陷,就是在默认的新建、编辑页面中虽然可以正常使用,但是在DataFormWebPart中(就是用SPD插入的“自定义列表表单”)中,SaveHandler无法被触发,而且当前的FormContext也有一些属性不正常(例如拿不到页面上的控件,FormMode是Invalid)……我还没有实验使用ListFormWebPart(就是原来那个表单WebPart)配合RenderTemplate的方式是不是能够行的通……