在 Visual Studio 2010 中创建 SharePoint 2010 事件接收器

SharePoint 可视操作方法

**摘要:**了解如何使用 Microsoft Visual Studio 2010 为 Microsoft SharePoint 2010 创建事件接收器。

上次修改时间: 2012年9月12日

适用范围: Office 2010 | SharePoint Foundation 2010 | SharePoint Server 2010 | Visual Studio | Visual Studio 2008 | Visual Studio 2010

供稿人:  Ben Hedges,Point8020

概述

Microsoft Visual Studio 2010 提供了一个可用于生成事件接收器的项目类型,事件接收器会在 Microsoft SharePoint 2010 网站上选择事件之前或之后执行操作。此示例演示如何将事件添加到自定义列表项的添加和更新操作中。

编码

此 SharePoint 直观操作方法介绍了用于在 Visual Studio 2010 中创建和部署事件接收器的以下步骤:

  1. 重写 itemAdding 事件和 itemUpdating 事件。

  2. 验证正在将项目添加到的列表是否为"Open Position"列表。

  3. 提升权限,使此代码能访问安全网站以检索批准的职务。

  4. 将批准的"Job Titles"与在"Open Position"列表中创建的新项的职位进行比较。

  5. 在"Job Title"未获得批准时取消此事件。

在此示例中,安全子网站包含一个名为"Job Definitions"的列表,此列表为组织中的角色指定允许的职务。除职务之外,此列表还包含有关职务的工资机密信息,因此应阻止用户获取此信息。主网站中有一个名为"Open Positions"的列表,该列表将跟踪组织中的空缺。您为 itemAdding 和 itemUpdating 事件创建两个事件接收器,它们将验证开放职位是否匹配"Job Definitions"列表中批准的职位之一。

先决条件

开始之前,创建子网站和所需列表。

创建"Job Definitions"子网站

  1. 在主网站的"网站操作"菜单上,单击"新建网站"。

  2. 在"新建网站"对话框中,单击"空白网站"。

  3. 在该对话框的右侧,单击"更多选项"。

  4. 在"标题"框中,键入 Job Definitions。

  5. 在"网站地址"框中键入 JobDefinitions。

  6. 在"权限"部分,单击"使用独有权限",然后单击"创建"。

  7. 在"此网站的访问者"部分,选择"使用现有用户组",然后选择"工作组网站所有者"。单击"确定"。

创建"Job Definitions"列表

  1. 在"Job Definitions"网站中,创建一个名为"Job Definitions"的自定义列表,此列表包含以下列:

    • Title(默认列)

    • MinSalary(货币)

    • MaxSalary(货币)

    • Role Type(选项:"Permanent"、"Contract")

  2. 向此列表添加多个工作。请记下为创建的每个工作指定的职务,因为您稍后需要用到它们。

创建"Open Positions"列表

  • 在父网站中,创建一个名为"Open Positions"的自定义列表,此列表包含以下列:

    • Title(默认列)

    • Location(单行文本)

创建事件接收器

紧接着,在 Visual Studio 2010 中创建一个"事件接收器"项目,然后向事件接收器文件添加代码。

在 Visual Studio 2010 中创建 SharePoint 2010 事件接收器

  1. 启动 Visual Studio 2010。

  2. 在"文件"菜单上,单击"新建",然后单击"项目"。

  3. 在"新建项目"对话框中的"已安装的模板"部分,展开"Visual Basic"或"Visual C#",展开"SharePoint",然后单击"2010"。

  4. 在模板列表中,单击"事件接收器"。

  5. 在"名称"框中键入 VerifyJob。

  6. 保留其他字段的默认值不变,然后单击"确定"。

  7. 在"要使用哪个本地站点进行调试?"列表中,选择您的网站。

  8. 选择"部署为场解决方案"选项,然后单击"下一步"。

  9. 在"选择事件接收器设置"页的"需要哪种类型的事件接收器?"列表中,选择"列表项事件"。

  10. 在"哪个项应为事件源?"列表中,选择"自定义列表"。

  11. 在"处理以下事件"下,选中"正在添加项"和"正在更新项"复选框。单击"完成"。

修改事件接收器文件

  1. 在事件接收器文件中,向类添加以下代码。

    Public Function CheckItem(ByVal properties As SPItemEventProperties) As Boolean
    Dim jobTitle As String = properties.AfterProperties("Title").ToString()
        Dim allowed As Boolean = False
        Dim jobDefWeb As SPWeb = Nothing
        Dim jobDefList As SPList
        Dim privilegedAccount As SPUser = properties.Web.AllUsers("SHAREPOINT\SYSTEM")
       Dim privilegedToken As SPUserToken = privilegedAccount.UserToken
    
        Try
            Using elevatedSite As New SPSite(properties.Web.Url, privilegedToken)
                Using elevatedWeb As SPWeb = elevatedSite.OpenWeb()
                    jobDefWeb = elevatedWeb.Webs("JobDefinitions")
                    jobDefList = jobDefWeb.Lists("Job Definitions")
    
                    For Each item As SPListItem In jobDefList.Items
                        If item("Title").ToString() = jobTitle Then
                            allowed = True
                            Exit For
                        End If
                    Next
    
                End Using
            End Using
    
            Return (allowed)
    
        Finally
            jobDefWeb.Dispose()
        End Try
    End Function

    bool checkItem(SPItemEventProperties properties)
      {
          string jobTitle = properties.AfterProperties["Title"].ToString();
          bool allowed = false;
          SPWeb jobDefWeb = null;
          SPList jobDefList;
          SPUser privilegedAccount = properties.Web.AllUsers[@"SHAREPOINT\SYSTEM"];
          SPUserToken privilegedToken = privilegedAccount.UserToken;
          try
          {
              using (SPSite elevatedSite = new SPSite(properties.Web.Url, privilegedToken))
              {
                  using (SPWeb elevatedWeb = elevatedSite.OpenWeb())
                  {
                      jobDefWeb = elevatedWeb.Webs["JobDefinitions"];
                      jobDefList = jobDefWeb.Lists["Job Definitions"];
                      foreach (SPListItem item in jobDefList.Items)
                      {
                          if (item["Title"].ToString() == jobTitle)
                          {
                              allowed = true;
                              break;
                          }
                      }
                  }
              }
              return (allowed);
          }
          finally
          {
              jobDefWeb.Dispose();
          }
      }
  2. 在"EventReceiver1"文件中,将 ItemAdding 方法替换为以下代码。

    Public Overrides Sub ItemAdding(properties as SPItemEventProperties)
        Try
            Dim allowed As Boolean = True
    
            If properties.ListTitle = "Open Positions" Then
                allowed = CheckItem(properties)
            End If
    
            If allowed = False Then
                properties.Status = SPEventReceiverStatus.CancelWithError
                properties.ErrorMessage = _
                  "The job you have entered is not defined in the Job Definitions List"
                properties.Cancel = True
            End If
    
        Catch ex As Exception
            properties.Status = SPEventReceiverStatus.CancelWithError
            properties.ErrorMessage = ex.Message
            properties.Cancel = True
        End Try
    End Sub

    public override void ItemAdding(SPItemEventProperties properties)
        {
          try
            {
                bool allowed = true;
    
                if (properties.ListTitle == "Open Positions")
                {
                 allowed = checkItem(properties);
                }
            
                   if (!allowed)
                {
                   properties.Status = SPEventReceiverStatus.CancelWithError;
                   properties.ErrorMessage =
                     "The job you have entered is not defined in the Job Definitions List";
                   properties.Cancel = true;
                }
            }
            catch (Exception ex)
            {
                properties.Status = SPEventReceiverStatus.CancelWithError;
                properties.ErrorMessage = ex.Message;
                properties.Cancel = true;
            }
        }
  3. 在"EventReceiver1"文件中,将 ItemUpdating 方法替换为以下代码。

    Public Overrides Sub ItemUpdating(properties as SPItemEventProperties)
            Try
                Dim allowed As Boolean = True
    
                If properties.ListTitle = "Open Positions" Then
                    allowed = CheckItem(properties)
                End If
    
                If allowed = False Then
                    properties.Status = SPEventReceiverStatus.CancelWithError
                    properties.ErrorMessage = _
                      "The job you have entered is not defined in the Job Definitions List"
                    properties.Cancel = True
                End If
    
            Catch ex As Exception
                properties.Status = SPEventReceiverStatus.CancelWithError
                properties.ErrorMessage = ex.Message
                properties.Cancel = True
    
            End Try
    End Sub

    public override void ItemUpdating(SPItemEventProperties properties)
        {
               
            bool allowed = true;
    
            if (properties.ListTitle == "Open Positions")
            {
                allowed = checkItem(properties);
            }
            
            try
            {
                
                if (!allowed)
                {
                    properties.Status = SPEventReceiverStatus.CancelWithError;
                    properties.ErrorMessage =
                      "The job you have entered is not defined in the Job Definitions List";
                    properties.Cancel = true;
                }
            }
            catch (Exception ex)
            {
                properties.Status = SPEventReceiverStatus.CancelWithError;
                properties.ErrorMessage = ex.Message;
                properties.Cancel = true;
            }
        }

部署项目

  1. 在解决方案资源管理器中,右键单击该项目,然后单击"部署"

  2. 在 SharePoint 网站的"Open Positions"列表中,单击"添加新项"。

  3. 在"Title"字段中,为未包含在安全子网站中的"Job Definitions"列表中的工作说明提供职务。

  4. 单击"保存"。您将收到一条来自事件接收器的消息。

  5. 在"Title"字段中,为包含在安全子网站中的"Job Definitions"列表中的工作说明提供职务。

  6. 单击"保存"。这将创建此职位。

读取
  • 此解决方案将重写 ItemAdding 和 ItemUpdating 方法,并验证正在将项目添加到的列表是否为"Open Positions"列表。如果是,则调用 CheckItem 方法,以传入与此事件关联的属性。

  • 在 CheckItem 方法中,提升权限以确保成功访问安全子网站。将批准的列表中的职务和此事件所关联的 properties.AfterProperties 属性的职务进行比较。如果任何职务匹配,则将 allowedBoolean 变量设置为 true,并且此方法将返回。

  • 根据 allowed 变量的值,调用方法将允许此事件或设置 properties.ErrorMessage 属性,然后使用 properties.cancel 取消此事件。

观看

观看视频

观看视频(该链接可能指向英文页面) (00:04:53)

单击以获取代码

获取代码(该链接可能指向英文页面)

浏览

关于作者

社区参与者  Ben HedgesPoint8020 公司的研发高级副总裁。Ben 对构建有关 SharePoint 的人才管理、合规性以及学习和开发解决方案的模型尤其感兴趣。Ben 具有使用 Microsoft 技术实现客户要求的丰富经验。