65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 3.5 中 AJAX 的基础 SharePoint Web 部件

2008 年 4 月 9 日

CPOL

2分钟阅读

viewsIcon

64846

一个基础 SharePoint Web 部件,用于支持 ASP.NET 3.5 中的 AJAX。

引言

本文描述了一个为 SharePoint 2007 (WSS 3.0 或 MOSS 2007) 平台开发的抽象 Web 部件类。该 Web 部件包含解决 SharePoint 和 ASP.NET AJAX 之间一些已知冲突的逻辑,并被设计为所有启用 AJAX 的 SharePoint Web 部件的基础类。

背景

在 SharePoint (WSS 3.0 或 MOSS 2007) SP1 中,AJAX 得到官方支持。但是,为了使 AJAX 在 SharePoint 环境中工作,仍然需要执行大量的手动配置。基本上,您可以创建一个针对 .NET Framework 3.5 的 ASP.NET Web 应用程序,并将 AJAX 相关条目合并到 SharePoint 应用程序的 web.config 文件中。但这还不够。在 MSDN 文章《演练:创建基本的启用 ASP.NET AJAX 的 Web 部件》中,介绍了一种解决 SharePoint 和 ASP.NET AJAX UpdatePanel 之间冲突的技术。这篇文章为开发启用 AJAX 的 SharePoint Web 部件提供了一个良好的起点。但是,文章中描述的技术也有其局限性。我将在下面详细介绍这些局限性,并解释如何解决它们。

使用代码

ASP.NET AJAX 需要在任何页面上只有一个实例的 ScriptManager。有几种方法可以将 ScriptManager 包含在 SharePoint Web 部件页面中。一种方法是修改母版页。另一种常见技术是检测是否已经存在 ScriptManager 的实例,如果不存在则按需创建一个。我更喜欢后者,因为它比修改母版页更灵活,而修改母版页会影响所有页面,无论页面是否使用 AJAX。毕竟,有一些第三方 AJAX 库当前与 ASP.NET AJAX 不兼容,并且您可能无法完全控制门户上显示的所有内容。

在再次回顾 ASP.NET 页面的生命周期 之后,我决定将创建 ScriptManager 实例的逻辑放在 OnInit 事件中,并且效果很好。

另一个问题在于“EnsurePanelFix”逻辑,因为它也不应该注册多次。通过为启用 AJAX 的 Web 部件创建一个公共基础类,并使用基础 Web 部件的类型注册脚本,可以解决这个问题。这尤其好,因为基础 Web 部件不仅可以促进代码重用,还可以解决问题!

Web 部件的完整代码包含在下面

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.Services;
using System.Web.UI;
using System.ComponentModel;
using System.Xml.Serialization;
using System.Web.UI.WebControls;

public abstract class AjaxBaseWebPart : 
       System.Web.UI.WebControls.WebParts.WebPart
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        // Register the ScriptManager
        ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
        if (scriptManager == null)
        {
            scriptManager = new ScriptManager();
            scriptManager.ID = "ScriptManager1";
            scriptManager.EnablePartialRendering = true;
            Controls.AddAt(0, scriptManager);
        }
    }

    protected override void CreateChildControls()
    {
        // Add fix according to
        // http://msdn2.microsoft.com/en-us/library/bb861877.aspx
        EnsurePanelFix();
    }

    private void EnsurePanelFix()
    {
        if (this.Page.Form != null)
        {
            String fixupScript = @"
            _spBodyOnLoadFunctionNames.push(""_initFormActionAjax"");
            function _initFormActionAjax()
            {
                if (_spEscapedFormAction == document.forms[0].action)
                {
                    document.forms[0]._initialAction = 
                    document.forms[0].action;
                }
            }
            var RestoreToOriginalFormActionCore = RestoreToOriginalFormAction;
            RestoreToOriginalFormAction = function()
            {
                if (_spOriginalFormAction != null)
                {
                    RestoreToOriginalFormActionCore();
                    document.forms[0]._initialAction = 
                    document.forms[0].action;
                }
            }";
            ScriptManager.RegisterStartupScript(this,
              typeof(AjaxBaseWebPart), "UpdatePanelFixup",
              fixupScript, true);
        }
    }
}

关注点

尽管 SharePoint 2007 的 SP1 官方支持 AJAX,但仍然需要付出很多努力才能在 SharePoint 环境中使用 AJAX。也许 Visual Studio 2008 的下一个服务补丁将为 SharePoint 开发提供与我们为 ASP.NET 3.5 AJAX 获得的支持相同的支持?让我们拭目以待。

© . All rights reserved.