Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8236968
  • 博文数量: 444
  • 博客积分: 10593
  • 博客等级: 上将
  • 技术积分: 3852
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-09 15:26
文章分类

全部博文(444)

文章存档

2014年(1)

2013年(10)

2012年(18)

2011年(35)

2010年(125)

2009年(108)

2008年(52)

2007年(72)

2006年(23)

分类: 系统运维

2010-06-09 15:33:34

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();
}
阅读(2378) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~