[SharePoint 2010]如何定制事件处理程序的Error Pages

我想只要是做过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做的尽可能好一些,从而使用户可以很容易的知道自己究竟在哪里出了错。

 

posted on 2010-12-13 01:36  致良知  阅读(1793)  评论(2编辑  收藏  举报

导航