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 取消此事件。

在 Visual Studio 2010 中创建 SharePoint 2010 事件接收器的更多相关文章

  1. 在 Visual Studio 2013 中创建 ASP.NET Web 项目(0):专题导航 [持续更新中]

    写在前面的话 随着 Visual Studio 2013 的正式推出,ASP.NET 和 Visual Studio Web 开发工具 也发布了各自的最新版本. 新版本在构建 One ASP.NET ...

  2. 在 Visual Studio 2013 中创建 ASP.NET Web 项目(1):概述 - 创建 Web 应用程序项目

    注:本文是“在 Visual Studio 2013 中创建 ASP.NET Web 项目”专题的一部分,详情参见 专题导航 . 预备知识 本专题适用于 Visual Studio 2013 及以上版 ...

  3. 【转载】在 Visual Studio 2012 中创建 ASP.Net Web Service

    在 Visual Studio 2012 中创建 ASP.Net Web Service,步骤非常简单.如下: 第一步:创建一个“ASP.Net Empty Web Application”项目 创建 ...

  4. 在Visual Studio 2015 中添加SharePoint 2016 开发模板

    前言 SharePoint 2016已经发布很久了,然而,默认安装VS2015以后,却没有SharePoint 2016的开发模板.其实问题很简单,和VS2012开发SharePoint 2013一样 ...

  5. Visual Studio 2015中创建C#的Android项目提示"Value cannot be null"的解决方法

    由于之前本机已安装过Android SDK,在安装Visual Studio 2015时跳过了,并没有为Xamarin指定对应路径导致.Visual Studio顶部菜单:Tools > Opt ...

  6. 简单记录在Visual Studio 2013中创建ASP.NET Web API 2

    在很多跨平台的应用中就需要Web API ,比如android与数据库的交互. Create a Web API Project 选择新建项目下的模板下的Visual C#节点下的Web节点,在模板列 ...

  7. 在Visual Studio 2012中使用VMSDK开发领域特定语言(二)

    本文为<在Visual Studio 2012中使用VMSDK开发领域特定语言>专题文章的第二部分,在这部分内容中,将以实际应用为例,介绍开发DSL的主要步骤,包括设计.定制.调试.发布以 ...

  8. Visual Studio 2013 无法创建MVC项目,系统找不到指定的文件.(Exception from HRESULT:08x0070002)

    在Visual Studio 2013中创建新MVC项目,(PS:现在创建个MVC项目,差点都找不到在哪,汗!-) 确定后提示,系统找不到指定的文件.(Exception from HRESULT:0 ...

  9. Visual Studio 2010中创建ASP.Net Web Service

    转自:http://blog.csdn.net/xinyaping/article/details/7331375 很多人在论坛里说,在Visual Studio 2010中不能创建“ASP.Net ...

随机推荐

  1. snmp协议接口

    所有网络设备上都会支持smap,获取服务器的基本信息,这样就不用在客户端上装应用就可以检测到基本的信息,是基于socket开发 内存调用这些命令来提取服务器的信息 snmpgetlocalhost - ...

  2. mysql加密和解密

    MySQL 4.1版本之前是MySQL323加密,MySQL 4.1和之后的版本都是MySQLSHA1加密, (1)以MySQL323方式加密 select  old_password('111111 ...

  3. Scala学习---映射和元祖

    1.设置一个映射,其中包含你想要的一些装备,以及他们的价格.然后构建另一个映射,采用同一组键,但在价格上打9折. scala> val map = Map("a"->1 ...

  4. 在Eclipse中设置文件的默认打开方式

    在Eclipse中,我们可以设置jsp.xml.js.sql等文件默认打开方式: ①.打开配置选项 ②.找到文件设置 ③.选中我们要设置的文件,默认即可:

  5. event 实现观察者模式

    看了一些其他人写的,一下就晕了,还是自己写一个给自己看吧. 用event语法糖实现的观察者,与普通的实现,最大的区别在于,Subject的操作中不会直接触发Observer的Update,而是通过ev ...

  6. Webpack学习笔记(一)

    转载http://zhaoda.net/webpack-handbook/module-system.html 转载http://www.cnblogs.com/vajoy/p/4650467.htm ...

  7. 【转】使用sinopia五步快速完成本地npm搭建

    使用sinopia五步快速完成本地npm搭建 时间 2016-03-01 14:55:30  繁星UED 原文  http://ued.fanxing.com/shi-yong-sinopiawu-b ...

  8. 通过SvcUtil.exe 生成 Wcf 客户端代理

    WCF服务调用通过两种常用的方式:一种是借助代码生成工具SvcUtil.exe或者添加服务引用的方式,一种是通过ChannelFactory直接创建服务代理对象进行服务调用. SvcUtil.exe ...

  9. ubuntu下百度云安装

    1.安装 在github上下载 .deb 安装包 下载地址 https://github.com/LiuLang/bcloud-packages 下载完成双击安装文件安装成功 2.解决验证码问题 (1 ...

  10. python中的pip安装

    windows下安装PIP 当前环境(windows 7,python安装路径为c:\Python) 1.首先到官网下载(https://pypi.python.org/pypi/setuptools ...