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

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

此 SharePoint 直观操作方法介绍了用于在 Visual Studio 2010 中创建和部署事件接收器的以下步骤:
- 重写 itemAdding 事件和 itemUpdating 事件。
- 验证正在将项目添加到的列表是否为“Open Position”列表。
- 提升权限,使此代码能访问安全网站以检索批准的职务。
- 将批准的“Job Titles”与在“Open Position”列表中创建的新项的职位进行比较。
- 在“Job Title”未获得批准时取消此事件。
在此示例中,安全子网站包含一个名为“Job Definitions”的列表,此列表为组织中的角色指定允许的职务。除职务之外,此列表还包含有关职务的工资机密信息,因此应阻止用户获取此信息。主网站中有一个名为“Open Positions”的列表,该列表将跟踪组织中的空缺。您为 itemAdding 和 itemUpdating 事件创建两个事件接收器,它们将验证开放职位是否匹配“Job Definitions”列表中批准的职位之一。
先决条件
开始之前,创建子网站和所需列表。
创建“Job Definitions”子网站
在主网站的“网站操作”菜单上,单击“新建网站”。
在“新建网站”对话框中,单击“空白网站”。
在该对话框的右侧,单击“更多选项”。
在“标题”框中,键入 Job Definitions。
在“网站地址”框中键入 JobDefinitions。
在“权限”部分,单击“使用独有权限”,然后单击“创建”。
在“此网站的访问者”部分,选择“使用现有用户组”,然后选择“工作组网站所有者”。单击“确定”。
创建“Job Definitions”列表
在“Job Definitions”网站中,创建一个名为“Job Definitions”的自定义列表,此列表包含以下列:
- Title(默认列)
- MinSalary(货币)
- MaxSalary(货币)
- Role Type(选项:“Permanent”、“Contract”)
向此列表添加多个工作。请记下为创建的每个工作指定的职务,因为您稍后需要用到它们。
创建“Open Positions”列表
在父网站中,创建一个名为“Open Positions”的自定义列表,此列表包含以下列:
- Title(默认列)
- Location(单行文本)
创建事件接收器
紧接着,在 Visual Studio 2010 中创建一个“事件接收器”项目,然后向事件接收器文件添加代码。
在 Visual Studio 2010 中创建 SharePoint 2010 事件接收器
启动 Visual Studio 2010。
在“文件”菜单上,单击“新建”,然后单击“项目”。
在“新建项目”对话框中的“已安装的模板”部分,展开“Visual Basic”或“Visual C#”,展开“SharePoint”,然后单击“2010”。
在模板列表中,单击“事件接收器”。
在“名称”框中键入 VerifyJob。
保留其他字段的默认值不变,然后单击“确定”。
在“要使用哪个本地站点进行调试?”列表中,选择您的网站。
选择“部署为场解决方案”选项,然后单击“下一步”。
在“选择事件接收器设置”页的“需要哪种类型的事件接收器?”列表中,选择“列表项事件”。
在“哪个项应为事件源?”列表中,选择“自定义列表”。
在“处理以下事件”下,选中“正在添加项”和“正在更新项”复选框。单击“完成”。
修改事件接收器文件
在事件接收器文件中,向类添加以下代码。
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 Functionbool 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();
}
}在“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 Subpublic 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;
}
}在“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 Subpublic 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;
}
}
部署项目
在解决方案资源管理器中,右键单击该项目,然后单击“部署”。
在 SharePoint 网站的“Open Positions”列表中,单击“添加新项”。
在“Title”字段中,为未包含在安全子网站中的“Job Definitions”列表中的工作说明提供职务。
单击“保存”。您将收到一条来自事件接收器的消息。
在“Title”字段中,为包含在安全子网站中的“Job Definitions”列表中的工作说明提供职务。
单击“保存”。这将创建此职位。

- 此解决方案将重写 ItemAdding 和 ItemUpdating 方法,并验证正在将项目添加到的列表是否为“Open Positions”列表。如果是,则调用 CheckItem 方法,以传入与此事件关联的属性。
- 在 CheckItem 方法中,提升权限以确保成功访问安全子网站。将批准的列表中的职务和此事件所关联的 properties.AfterProperties 属性的职务进行比较。如果任何职务匹配,则将 allowedBoolean 变量设置为 true,并且此方法将返回。
- 根据 allowed 变量的值,调用方法将允许此事件或设置 properties.ErrorMessage 属性,然后使用 properties.cancel 取消此事件。
在 Visual Studio 2010 中创建 SharePoint 2010 事件接收器的更多相关文章
- 在 Visual Studio 2013 中创建 ASP.NET Web 项目(0):专题导航 [持续更新中]
写在前面的话 随着 Visual Studio 2013 的正式推出,ASP.NET 和 Visual Studio Web 开发工具 也发布了各自的最新版本. 新版本在构建 One ASP.NET ...
- 在 Visual Studio 2013 中创建 ASP.NET Web 项目(1):概述 - 创建 Web 应用程序项目
注:本文是“在 Visual Studio 2013 中创建 ASP.NET Web 项目”专题的一部分,详情参见 专题导航 . 预备知识 本专题适用于 Visual Studio 2013 及以上版 ...
- 【转载】在 Visual Studio 2012 中创建 ASP.Net Web Service
在 Visual Studio 2012 中创建 ASP.Net Web Service,步骤非常简单.如下: 第一步:创建一个“ASP.Net Empty Web Application”项目 创建 ...
- 在Visual Studio 2015 中添加SharePoint 2016 开发模板
前言 SharePoint 2016已经发布很久了,然而,默认安装VS2015以后,却没有SharePoint 2016的开发模板.其实问题很简单,和VS2012开发SharePoint 2013一样 ...
- Visual Studio 2015中创建C#的Android项目提示"Value cannot be null"的解决方法
由于之前本机已安装过Android SDK,在安装Visual Studio 2015时跳过了,并没有为Xamarin指定对应路径导致.Visual Studio顶部菜单:Tools > Opt ...
- 简单记录在Visual Studio 2013中创建ASP.NET Web API 2
在很多跨平台的应用中就需要Web API ,比如android与数据库的交互. Create a Web API Project 选择新建项目下的模板下的Visual C#节点下的Web节点,在模板列 ...
- 在Visual Studio 2012中使用VMSDK开发领域特定语言(二)
本文为<在Visual Studio 2012中使用VMSDK开发领域特定语言>专题文章的第二部分,在这部分内容中,将以实际应用为例,介绍开发DSL的主要步骤,包括设计.定制.调试.发布以 ...
- Visual Studio 2013 无法创建MVC项目,系统找不到指定的文件.(Exception from HRESULT:08x0070002)
在Visual Studio 2013中创建新MVC项目,(PS:现在创建个MVC项目,差点都找不到在哪,汗!-) 确定后提示,系统找不到指定的文件.(Exception from HRESULT:0 ...
- Visual Studio 2010中创建ASP.Net Web Service
转自:http://blog.csdn.net/xinyaping/article/details/7331375 很多人在论坛里说,在Visual Studio 2010中不能创建“ASP.Net ...
随机推荐
- python操作----Memcached
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...
- js的变量声明以及变量提升
js的变量声明: js正常的变量声明就不多讲了,形如var a=1;这样的变量声明在实际开发中最常用. var a=1,b=2;这种以逗号分隔开的一次声明多个变量,其实相当于var a=1; var ...
- 一:python入门
Python简介 这点就不做陈述了,相信各位朋友已经已经有了一定的了解. Python特色: 1:简单 第一次接触Python给我的感觉它的语法阅读就像是阅读一本英文书的目录一样,简单易懂,它的语法要 ...
- Ubuntu14.04安装完全分布式Hadoop1.2.1
一直想装hadoop集群,但总是没有时间,最近抽了三天时间下定决定装了一下,在我的wmware上虚拟了一台Ubuntu14.04,然后再复制了两台虚拟机,准备开始!!!! 基本参考 http://ww ...
- Acer VN7 Win10小键盘修改
由于 Home End 正常位置太远, NumberLock 容易误按, 故设置win10 键位映射如下图
- ubuntu tips
1.ibus-setup 2.tips:
- 基础dp
队友的建议,让我去学一学kuangbin的基础dp,在这里小小的整理总结一下吧. 首先我感觉自己还远远不够称为一个dp选手,一是这些题目还远不够,二是定义状态的经验不足.不过这些题目让我在一定程度上加 ...
- socket编程——一个简单的例子
从一个简单的使用TCP例子开始socket编程,其基本步骤如下: server client ++++ ...
- [妙味JS基础]第五课:函数传参、重用、价格计算
知识点总结 函数传参,传的参数=数据类型(即:数值.字符串.布尔.函数.对象.未定义) 通过传参来重用代码 1.尽量保证 HTML 代码结构一致,可以通过父级选取子元素 2.把核心主程序实现,用函数包 ...
- MVC运行机制
一,第一次程序运行时 1,第一次请求的时候 会获取配置文件,然后有个应用启动事件到global.asax.2,在Global.asax文件中,网站第一次运行会创建RouteTable对象,实现URL到 ...