VS2008建立与调试SharePoint EventHandler的过程总结.
在完成这两天任务的过程中,再次经历了Moss EventHandler的开发过程. 在此写下一些编程手法.
为了提高开发和调试效率,这几个Tips最好可以有所了解.
1. 在Sharepoint所安装的IIS上进行参数的设置,使调试模式被确认。vs2008可自动部署为wsp,并在本地Sharepoint Home根站点上注册并激活,我们仍需要查看根站点的site feature,再去我们的测试子站点上激活site features.这样就可以开始调试了.
2. 分析好将要使用哪几个EventHandler,注意-ing 和 -ed视情况选择. 在里面输入一些测试语句(properties.Cancel = true; properties.ErrorMessage = "Testing on ..."),包括DisableEventFiring()及EnableEventFiring(),这是一组必要的方法,在可能引起连发Update反应的地方禁止事件的触发,可避免事件之间因更新造成的相互触发而成为死循环的状况。
3. 确定几个EventHandler携带DisableEventFiring()及EnableEventFiring()都可以作触发时,才在其中开始写真正的逻辑,并且写一点调试一点。这一点很重要,因为Sharepoint部署是feature或wsp方式,里面的xml文件在GUID配置时,有时会出现自动部署上的差错,也许是个人在项目删除和IISReset诸多方面的原因吧.
4. 最好不要用properties.Items[properties.ListItemID], 而应该用properties.ListItem.
同理,应该用 SPList list = web.Lists[properties.ListTitle] as SPList,而非ListID.
5. 在循环遍历时,最好使用foreach(SPListItem item in list.Items), 在删除操作时,最好不要使用foreach, 而应采用从后向前的for方式,同时推荐使用list.ItemCount 来替代 list.Items.Count. 例如:
for(int i = list.ItemCount – 1; i >= 0; i--)
{
list.Items[i].Delete();
}
6. 在进行ItemUpdating,ItemAdding编程时,一个是Sharepoint对象,一个是将要更新的后台数据库信息,它们一个对应事件发生前的值,一个对应事件发生后的值。
如果需要对输入的信息由程序进行截取并自动校正后存入数据库,就必须要注意三点:
对于头两点,如果理解不深刻,需要单步调试,确定哪个是现在用户输入并将要更新数据库的值。
int intPriorityValue1 = Convert.ToInt32(properties.AfterProperties[m_strFieldName_Priority].ToString());
int intPriorityValue2 = Convert.ToInt32(properties.BeforeProperties[m_strFieldName_Priority].ToString());
properties.AfterProperties.ChangedProperties[m_strFieldName_Priority] = intInterval2;
尽量先确定前两个,再根据选择使用第三个. 此外如果前两点所述方法都报异常(在写ItemDeleting时会出现),那么则需要获得现在数据库里的值,可以这样做:
using (SPWeb web = properties.OpenWeb() as SPWeb)
{
list = web.Lists[properties.ListTitle] as SPList;
listItem = properties.ListItem as SPListItem;
m_currentGuid = listItem.UniqueId;
m_lastPosition = list.ItemCount;
string strValueInDB = listItem[strFieldName].ToString();
}