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





3.00/5 (3投票s)
一个基础 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 获得的支持相同的支持?让我们拭目以待。