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

时间:2021-09-09 11:56:32

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

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

在 Visual Studio 2010 中创建 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. 单击“保存”。这将创建此职位。

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

  • 此解决方案将重写 ItemAddingItemUpdating 方法,并验证正在将项目添加到的列表是否为“Open Positions”列表。如果是,则调用 CheckItem 方法,以传入与此事件关联的属性。
  • CheckItem 方法中,提升权限以确保成功访问安全子网站。将批准的列表中的职务和此事件所关联的 properties.AfterProperties 属性的职务进行比较。如果任何职务匹配,则将 allowedBoolean 变量设置为 true,并且此方法将返回。
  • 根据 allowed 变量的值,调用方法将允许此事件或设置 properties.ErrorMessage 属性,然后使用 properties.cancel 取消此事件。