HDU 1114 Piggy-Bank

SharePoint 2010列表项事件接收器ItemAdding的使用方法

 

列表项事件处理器是继承于Microsoft.SharePoint.SPItemEventReceiver的类,Microsoft.SharePoint.SPItemEventReceiver类提供了许多的虚方法,我们可以重载这些方法来编写我们自己的事件处理器,其中ItemAdding是在列表项添加之前调用的方法,也就是说列表项数据还没有被添加到列表时调用ItemAdding方法,用于处理一些前事件操作。

SharePoint2010的ItemAdding事件处理器可以直接在Visual Studio 2010开发工具中编写,如图1所示:

HDU 1114 Piggy-Bank

图1

在图1中选择“SharePoint 2010”项目下的“事件接收器”,点击确定按钮,如图2所示:

HDU 1114 Piggy-Bank

图2

在图2的第一个下拉列表框中选择“列表项事件”,然后在第二个下拉列表框中选择使用哪个列表模板为事件源,在这里要注意,是列表模板,而不是列表实例,也就是说我们基于列表模板创建的任何列表都不会显示在此下拉列表框中,图2列出来的全是系统自带的列表模板。如图3所示:

HDU 1114 Piggy-Bank

图3

那么我们使用“列表设置”页面中的“将列表另存为模板”创建的列表模板会在图3的下拉列表框中显示出来吗?我们在这里做个例子,随便找个自定义的列表,然后将其另存为模板,如图4所示:

HDU 1114 Piggy-Bank

图4

图4中“DemoListTemplate”就是另存为的列表模板,然后我们再重新做一下图3的操作,你会发现结果跟图3还是一样,也就是说虽然在图4的创建窗口可以看到另存为的列表模板,但是SharePoint 2010还是认为此模板是“自定义列表”模板。这里我们选择“自定义列表”,最后在图2中选择“正在添加项”事件,也就是ItemAdding事件,点击“完成”按钮。如图5所示:

HDU 1114 Piggy-Bank

图5

在图5中我们可以看到,SharePoint 2010已经可以自动部署事件处理器,并且会自动将事件封装到Feature中,我们关心的只需要编写ItemAdding事件业务逻辑即可。注册ItemAdding事件是在图5的Elements.xml文件中,如图6所示:

HDU 1114 Piggy-Bank
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http:  //schemas.microsoft.com/sharepoint/">
  <Receivers ListTemplateId="100">
      <Receiver>
        <Name>ItemAddingEventReceiverItemAdding</Name>
        <Type>ItemAdding</Type>
        <Assembly>$SharePoint.Project.
AssemblyFullName$</Assembly>
       <Class>EventReceiver.ItemAddingEventReceiver.
ItemAddingEventReceiver</Class>
        <SequenceNumber>10000</SequenceNumber>
      </Receiver>
  </Receivers>
</Elements>
HDU 1114 Piggy-Bank

 

 

上面的这段XML文件中,每个Receiver节点表示一个事件处理器,Type表示要注册的事件类型,当然也可以同时处理多个事件。

下面是使用ItemAdding事件处理器来检查在列表中添加的“标题”字段值中是否包含0的一个例子,代码如下:

HDU 1114 Piggy-Bank
/// <summary>
/// 正在添加项.
/// </summary>
public override void ItemAdding(SPItemEventProperties properties)
{
    //防止事件循环执行
    this.EventFiringEnabled = false;
    //表示只是针对自定义列表DemoList起作用,否则所有自定义列表都会调用此事件。
    if (properties.ListTitle.Equals("DemoList"))
    {
        //获取将要添加到列表中的新值
        string afterValue = properties.AfterProperties["Title"].ToString();
        if (afterValue.Contains("0"))
        {
            //取消ItemAdding事件的执行。
            properties.Cancel = true;
            properties.ErrorMessage = "此列表Title字段数据不允许包括0";
        }
    }
    this.EventFiringEnabled = true;
}
HDU 1114 Piggy-Bank

 

在SharePoint 2010开发事件处器时,必须在事件处理器中首先使用:

this.EventFiringEnabled = false;禁止事件的触发,防止事件的循环触发,然后再在代码的最后使用this.EventFiringEnabled = true;启用事件的触发。

上面的代码使用了properties.ListTitle.Equals("DemoList")来判断此事件只对DemoList列表起作用。否则会对所有站点下基于“自定义列表”模板创建的列表触发此事件。

此事件的作用是当添加的数据中包括0时则取消此事件的执行并显示错误信息,使用了properties.AfterProperties["Title"].ToString()来获取输入的新值。上面的代码在Visual Studio 2010里直接部署即可,当在“DemoList”列表的“标题”字段中添加数据时,如果包含0则会出现错误信息,

HDU 1114 Piggy-Bank

上一篇:SharePoint 2010列表项事件接收器ItemAdding的使用方法


下一篇:linux中文显示乱码的解决办法