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

概述

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”的列表,该列表将跟踪组织中的空缺。您为 itemAddingitemUpdating 事件创建两个事件接收器,它们将验证开放职位是否匹配“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. 单击“保存”。这将创建此职位。

读取

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

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

  • 根据 allowed 变量的值,调用方法将允许此事件或设置 properties.ErrorMessage 属性,然后使用 properties.cancel 取消此事件。
posted @ 2013-08-16 15:44  Star★  阅读(475)  评论(0编辑  收藏  举报