zoukankan      html  css  js  c++  java
  • 在 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("SHAREPOINTSYSTEM")
         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[@"SHAREPOINTSYSTEM"];
            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 取消此事件。
  • 相关阅读:
    HDU:2767-Proving Equivalences(添边形成连通图)
    POJ:1330-Nearest Common Ancestors(LCA在线、离线、优化算法)
    HDU:1269-迷宫城堡(tarjan模板)
    Xml 丶json丶 C/S KVO 数据库 SQL 数据持久化 复杂对象 集合视图综合
    项目穿越记
    SDP (Session Description Protocol)
    shell脚本实现查找文件夹下重复的文件,并提供删除功能
    HDU 2896 病毒侵袭 (AC自动机)
    项目启动那些事儿
    C++ 完美破解九宫格(数独)游戏
  • 原文地址:https://www.cnblogs.com/TNSSTAR/p/3262291.html
Copyright © 2011-2022 走看看