我想只要是做过MOSS开发工作的人都应该很熟悉EventHandler了吧,通过EventHandler我们可以在某些事件发生的时或发生后执行我们自定义的代码。大家可能都遇到过这种需求,就是在用户创建新的列表项目时可以对用户所输入的内容进行验证,在SharePoint 2007中我们怎么做呢?开发自定义字段类型?好是好,就是太麻烦了,有没有简单一点的方法呢?事件处理程序?这个好,实现起来也简单,我们可以在ItemAdding事件里获得用户输入的内容,然后根据一定的逻辑去判断用户输入内容的有效性,如果未通过就Cancle掉,这个方法是真好,可就是那个验证未通过后抛出的Error页面实在是太难看了,最终用户很少有能接受的,而且还经常被测试人员当BUG给指出来。。。。。。在SharePoint 2007中实在是没有什么好办法来解决这个问题,不过,幸运的是在SharePoint 2010中这个问题终于被解决了。
下面我将向大家介绍在SharePoint 2010中如何定制事件处理程序的Error Pages。
创建一个拥有自定制Error Page的事件处理程序
首先让我们打开VS 2010并且使用事件接受器模板创建一个新的事件处理程序。
我们可以选择是创建一个场解决方案还是沙盒解决方案
最后选择事件接受器的类型,由于我的这个例子是要验证用户的输入内容,所以在这里我选择创建一个ItemAdding类型的事件接受器。
单击完成,随后我们会看到VS 2010自动为我们创建出了如下的结构的项目
接下来要做的就是为我的事件处理程序添加代码,以处理一些简单的逻辑。打开EventReceiver1.cs,VS已经为我们建立好了大部分的内容,我只需添加一些核心的逻辑就可以了。
using System; using System.Security.Permissions; using Microsoft.SharePoint; using Microsoft.SharePoint.Security; using Microsoft.SharePoint.Utilities; using Microsoft.SharePoint.Workflow; namespace ItemAddingWithCustomErrorPage.EventReceiver1 { /// <summary> /// 列表项事件 /// </summary> public class EventReceiver1 : SPItemEventReceiver { /// <summary> /// 正在添加项. /// </summary> public override void ItemAdding(SPItemEventProperties properties) { base.ItemAdding(properties); if (properties.AfterProperties["到期日期"]==null) { properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl; properties.RedirectUrl = "/_layouts/ItemAddingWithCustomErrorPage/CustomErrorPage.aspx"; } } } }
下面要做的就是添加一个用于显示错误信息的应用程序页。首先添加一个新项,仍然是在SharePoint 2010模板中,选择应用程序页模板。
Visual Studio 2010会自动创建一个名为Layouts的映射文件夹,它会映射到SharePoint安装目录中的Layouts目录。
下面要做的就是编辑这个应用程序页面,我们可以自由的定制它的样式,以及其中要显示的信息。
<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %> <%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %> <%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %> <%@ Import Namespace="Microsoft.SharePoint" %> <%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CustomErrorPage.aspx.cs" Inherits="ItemAddingWithCustomErrorPage.Layouts.ItemAddingWithCustomErrorPage.CustomErrorPage" DynamicMasterPageFile="~masterurl/default.master" %> <asp:Content ID="PageHead" ContentPlaceHolderID="PlaceHolderAdditionalPageHead" runat="server"> </asp:Content> <asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server"> <div style="width:225px;float:left;"> <asp:Image ID="Image1" runat="server" ImageUrl="/_layouts/ItemAddingWithCustomErrorPage/saw.png"/> </div> <div style="width:400px;"> [SharePoint 2010]如何定制事件处理程序的Error Pages,希望能有更多的朋友能够加入到SharePoint这个大家园中来。 </div> </asp:Content> <asp:Content ID="PageTitle" ContentPlaceHolderID="PlaceHolderPageTitle" runat="server"> 这是一个自定义的错误信息页面 </asp:Content> <asp:Content ID="PageTitleInTitleArea" ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea" runat="server" > 这是一个自定义的错误信息页面 </asp:Content>
OK,到这里代码就全部写完了,让我们来测试一下吧,直接按"F5"就可以了,VS 2010会自动帮我们部署到SharePoint网站中。
让我来新建一条通知。
为了测试我们定制的Error页面,我故意不输入到期日期,这样当触发ItemAdding事件时将判断到期日期字段的值为空,从而Cancle掉这个ItemAdding事件,并跳转到我们所定制的Error Page。
OY,成功了。显然我这个错误信息页面比较简陋,大家在项目中可以将这个Error Page做的尽可能好一些,从而使用户可以很容易的知道自己究竟在哪里出了错。