本文中的信息都是收集来的,来源很多,无法一一列出,望见谅。内容仅作为个人的知识管理。
Windows SharePoint Services v3 基于ASP.NET 2.0构建。Microsoft ASP.NET
AJAX 1.0在MOSS之后推出,因此在某些情况下,ASP.NET AJAX 和
SharePoint之间存在一些兼容性问题,这些问题将会在Windows SharePoint Services
SP1中解决。在此之前要在SharePoint中使用ASP.NET AJAX技术,需要进行一些特别的部署步骤。
注意:
UpdatePanel在 webpart中使用会有所限制。周详情况请查考ASP.NET
AJAX的文档。并不是任何的控件都能够在UpdatePanel中使用。
假如启用了输出缓存,就不能使用ASP.NET AJAX,否则会出现错误。经典的性能和时效的矛盾。
在SharePoint中使用Microsoft ASP.NET AJAX 1.0技术带来的好处:
能够形成一套完整的客户端脚本资源库,并积累一些可重用的部件。
能够使用 JSON展示我们的Web服务数据, 结果能够很容易的在JavaScript/Ajax应用程式中使用。
利用扩展中的技术构建WebPart能够提供高交互性的样式,比如一个具备自动完成功能的 textbox.
在WebPart中利用 UpdatePanel,实现无回调的交互,减少刷新页面的次数。
下面是部署使用了Microsoft ASP.NET AJAX
1.0技术的组件前的环境准备步骤。(只需在新安装的环境中部署一次,以后添加Webpart就不用了)
下载并在Web服务器场上安装ASP.NET AJAX
首先,必须安装 "ASP.NET 2.0 AJAX Extensions 1.0" ,能够从ajax.asp.net下载。
为Microsoft ASP.NET AJAX 1.0扩展 SharePoint web.config
我们需要为Ajax注册一些特定的条目。 编辑SharePoint的 web.config文档,该文档通常位于如下目录:
c:\inetpub\wwwroot\wss\virtualdirectories\80
添加 元素到 标记:
添加 节的内容,放在 /
标记中。
在标记内的 标记中添加下面的内容:
在 节中添加下面的内容:
在 HttpModules 节中添加下面的注册内容,放在任何已有的注册内容下面
在/节中,添加一条 SafeControl ,用于 Microsoft Ajax
Extensions的System.Web.UI命名空间。
最后,添加下面的 configuration标记到 web.config文档末尾, 在结束标记前面。
type="System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35"/>
利用AjaxBaseWebPart进行研发
编写使用该扩展的WebPart最简单的办法就是直接继承别人写好的AjaxBaseWebPart。下面是我用的一个。您也能够用其他的,或自己写一个。
下面是命名空间引用部分:
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Serialization;
using System.Web.UI;
using Microsoft.SharePoint.WebPartPages;
using Microsoft.SharePoint.Utilities;
using System.Web.UI.WebControls;
using System.Drawing;
下面是AjaxBaseWebPart类的实现部分:
///
/// A base class that implements all the functionality
required to use ASP.net Ajax extensions inside WSS
///
[XmlRoot(Namespace = "Deps.AjaxBaseWebpart")]
public abstract class AjaxBaseWebpart :
Microsoft.SharePoint.WebPartPages.WebPart
{
/*
* The idea and the code behind this base web
part was taken from Erics blog post at:
*
http://www.capdes.com/2007/02/ajaxbasepart_easy_aspnet_20_aj.html * This basically manages the presence and
configuration of the ScriptManager
* which is required by ASP.net ajax extensions
to handle postbacks, ect. This web part also includes
* a common method for handling errors.
*/
#region Declarations
private string _ValidationGroupId;
private ValidationSummary _ErrorContainer;
private ScriptManager _AjaxManager;
#endregion
#region Constructor
public AjaxBaseWebpart()
{
}
#endregion
#region Methods
///
/// Used to provide a common way to display errors to
the user of the current web part.
///
///
Description of the error that occured.
public void RegisterError(string message)
{
if
(this.Controls.Contains(_ErrorContainer))
{
//this way of generating a
unique control id is used in some of the OOB web parts
int uniqueCounter;
if
(HttpContext.Current.Items["GetUniqueControlId"] != null)
{
uniqueCounter =
(int)HttpContext.Current.Items["GetUniqueControlId"];
}
else
{
uniqueCounter = 0;
}
uniqueCounter++;
HttpContext.Current.Items["GetUniqueControlId"] = uniqueCounter;
//create a custom validator to
register the current error message with the ValidationSummary
control
CustomValidator cv = new
CustomValidator();
cv.ID = string.Concat("_Error_",
uniqueCounter);
cv.ValidationGroup =
_ValidationGroupId;
cv.Display =
ValidatorDisplay.None;
cv.IsValid = false;
cv.ErrorMessage = message;
this.Controls.Add(cv);
}
else
{
//if RegisterError is called
before the CreateChildControls override in AjaxBasePart then
transfer the user to an error page using the SPUtility
SPUtility.TransferToErrorPage("The CreateChildControls function of
the AjaxBasePart has not been called. You probably need to add
\"base.CreateChildControls()\" to the top of your
CreateChildControls override.");
}
}
///
/// Needs to be called to ensure that the
ValidationSummary control is registered on the page. Any child web
parts will need to have base.CreateChildControls() at the top of
their own CreateChildControls override.
///
protected override void CreateChildControls()
{
base.CreateChildControls();
if
(!this.Controls.Contains(_ErrorContainer))
{
_ValidationGroupId =
Guid.NewGuid().ToString();
_ErrorContainer = new
ValidationSummary();
_ErrorContainer.ID =
"_ErrorContainer";
_ErrorContainer.ValidationGroup
= _ValidationGroupId;
_ErrorContainer.BorderStyle =
BorderStyle.Solid;
_ErrorContainer.BorderWidth =
Unit.Pixel(3);
_ErrorContainer.BorderColor =
Color.Red;
this.Controls.Add(_ErrorContainer);
}
}
#endregion
#region Events
///
/// Oninit fires before page load. Modifications to
the page that are necessary to support Ajax are done here.
///
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
//get the existing ScriptManager if it
exists on the page
_AjaxManager =
ScriptManager.GetCurrent(this.Page);
if (_AjaxManager == null)
{
//create new ScriptManager and
EnablePartialRendering
_AjaxManager = new
ScriptManager();
_AjaxManager.EnablePartialRendering = true;
// Fix problem with postbacks
and form actions (DevDiv 55525)
Page.ClientScript.RegisterStartupScript(typeof(AjaxBaseWebpart),
this.ID, "_spOriginalFormAction = document.forms[0].action;",
true);
//tag:"form"
att:"&111nsubmit" val:"return _spForm&111nSubmitWrapper()"
blocks async postbacks after the first one
//not calling
"_spForm&111nSubmitWrapper()" breaks all postbacks
//returning true all the time,
somewhat defeats the purpose of the _spForm&111nSubmitWrapper()
which is to block repetitive postbacks, but it allows MS AJAX
Extensions to work properly
//its a hack that hopefully has
minimal effect
if (this.Page.Form != null)
{
string
form&111nSubmitAtt =
this.Page.Form.Attributes["&111nsubmit"];
if
(!string.IsNullOrEmpty(form&111nSubmitAtt) &&
form&111nSubmitAtt == "return
_spForm&111nSubmitWrapper();")
{
this.Page.Form.Attributes["&111nsubmit"] =
"_spForm&111nSubmitWrapper();";
}
//add the ScriptManager
as the first control in the Page.Form
//I dont think this
actually matters, but I did it to be consistent with how you are
supposed to place the ScriptManager when used declaritevly
this.Page.Form.Controls.AddAt(0, _AjaxManager);
}
}
}
#endregion
#region Properties
///
/// Exposes the Pages script manager. The value is
not set until after OnInit
///
[WebPartStorage(Storage.None)]
public ScriptManager AjaxManager
{
get { return _AjaxManager; }
set { _AjaxManager = value; }
}
#endregion
}
研发时只要继承这个WebPart就能够添加UpdatePanel,并在里面添加其他控件了。