SharePoint 2010开发工具图解系列:Visual Studio 2010创建事件接收器
练习 :创建用于响应事件错误的URL重定向
在此次练习中,您将创建一个错误页面,以便在用户遇到错误时可被重定向到该页面。取消事件已在WSS 3.0中被引入,但取消并将用户重定向到一个错误页面是WSS“14”新增的功能。
新建一个空白的SharePoint项目。启动Visual Studio 2010,选择文件» 新建项目,并按如下操作步骤新建一个空白项目。
项目类型: 已安装的模板» SharePoint » 2010
模板: 空白SharePoint项目
名称: CustomErrorPage
在SharePoint 自定义向导中,输入之前步骤创建的网站的URL地址(http://moss.contoso.com/sites/Lab03),来将其作为调试用网站,然后,勾选部署为场解决方案复选框。
首先,要创建一个事件接收器,用于将当前网站中的子网站数量限制为2个。这需要为当前项目添加一个新的项目条目。在解决方案资源管理器工具窗口中,右击CustomErrorPage项目,并选择添加» 新建项。在SharePoint » 2010模板列表中选择事件接收器,并将其命名为MaxSubSitesReceiver。
然后,该向导对话框将提示您设置该事件接收器的属性。使用如下操作步骤完成向导操作:
- 当提示设置需要哪种类型的事件接收器时,选择Web 事件。
- 当提示设置处理以下事件时,选正在配置网站。
打开MaxSubSitesReceiver\MaxSubsitesReceiver.cs代码文件。将WebAdding事件处理代码替换为如下代码:
public override void WebAdding(SPWebEventProperties properties) {
// check how many other subsites are in the current site this
// site is being created within... no more than 2 allowed
if (properties.Web.Webs.Count >= 2)
{
properties.Cancel = true;
properties.RedirectUrl = "/_layouts/CustomErrorPage/SiteCreationError.aspx";
properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl;
}
}
每当在当前网站(SPWeb)中新建子网站(SPWeb)时,该事件接收器将被触发,以检查当前网站中的子网站数量。如果已经存在两个子网站,则该事件接收器就会放弃新网站的创建操作,并将用户重定向到一个自定义的名为SiteCreationError.aspx的ASPX页面,您将在后面的步骤中创建该页面。
首先,考虑一下您创建一个自定义错误页面的理由。通过使用这项技术,您可以为用户提供特定于当前问题的充足上下文信息,并针对如何解决该问题提供指引。现在,您将创建一个用于告知用户无法向当前网站添加两个以上子网站的简单自定义错误页面。
现在,将创建一个在错误发生时由您的事件处理程序调用并重定向用户的自定义应用程序页面。右击CustomErrorPage项目,并选择添加» SharePoint的“Layouts” 映射文件夹:
右击Layouts\CustomErrorPage文件夹,选择添加 » 新建项,从SharePoint | 2010分组中选择应用程序页模板,并将该文件命名为SiteCreationError.aspx。
在代码视图中,打开SiteCreationError.aspx,并将Main、PageTitle 和 PageTitleInTitleArea占位符中的内容更新为如下代码:
<asp:Content ID="Main" contentplaceholderid="PlaceHolderMain" runat="server">
<p>
ERROR: You can only have a maximum of two (2) subsites in the current site.
</p>
</asp:Content>
<asp:Content ID="PageTitle" contentplaceholderid="PlaceHolderPageTitle" runat="server">
ERROR: Maximum Subsites in Current Site Exceeded
</asp:Content>
<asp:Content ID="PageTitleInTitleArea" contentplaceholderid="PlaceHolderPageTitleInTitleArea" runat="server" >
ERROR: Maximum Subsites in Current Site Exceeded
</asp:Content>
保存所有更改,并按[CTRL]+[F5],来生成和部署当前解决方案,以便测试您的工作成果。最后,Visual Studio将在浏览器中打开该网站。尝试通过创建页面http://moss.contoso.com/sites/Lab03/_layouts/create.aspx在当前网站中创建第三个子网站,并确保您的事件处理程序阻止该网站的创建操作。
- 注意,每当您创建一个子网站时,您都将被自动重定向到该新建网站。这就意味着,您需要在新建其他子网站之前,都要导航回原始网站。
- 当您创建第三个子网站时,您应该被重定向到您的自定义应用程序页面,其地址为http://moss.contoso.com/_layouts/CustomErrorPage/SiteCreationError.aspx。
- 如果直接使用网站操作或者查看所有网站内容中的创建,在安装有sliverlight的浏览器中,会启用sliverlight风格的创建页面,这时可以看到阻止创建成功,但是没有跳转。
同理,我们也可以添加一个列表项事件接收器。与上例相比,这种重定向更加接近SharePoint2010的界面风格。相关信息如下。
名称:TaskDueDateReceiver
绑定到任务,处理正在添加项事件。
打开TaskDueDateReceiver\TaskDueDateReceiver.cs代码文件。将ItemAdding事件处理代码替换为如下代码:
public override void ItemAdding(SPItemEventProperties properties)
{
base.ItemAdding(properties);
if (string.IsNullOrEmpty(properties.AfterProperties["DueDate"].ToString()))
{
properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl;
properties.RedirectUrl = "/_layouts/CustomErrorPage/DueDateErrorPage.aspx";
}
}
同样,在Layouts\CustomErrorPage下添加一个应用程序页DueDateErrorPage.aspx。,并将Main、PageTitle 和 PageTitleInTitleArea占位符中的内容更新为如下代码:
<asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server">
任务的截止日期没有填!
</asp:Content>
<asp:Content ID="PageTitle" ContentPlaceHolderID="PlaceHolderPageTitle" runat="server">
这是一个自定义的错误信息页面
</asp:Content>
<asp:Content ID="PageTitleInTitleArea" ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea" runat="server" >
这是一个自定义的错误信息页面
</asp:Content>
保存所有更改,并按[CTRL]+[F5]。在打开的浏览器中,点击任务列表,并新建一个任务项。如果没有填写截至日期,保存时会出现如下提示: