| 加入收藏| 设为首页| 联系我们

首页 站长学习 站长之家 源码下载 建站素材 书籍教程 常用工具
 您现在的位置: 动力中国 >> 网络编程 >> Ajax教程 >> 文章正文  
 基于ASP.NET AJAX的WebPart开发与部署
 

基于ASP.NET AJAX的WebPart开发与部署

http://www.domcn.org  文章来源:本站原创  点击数:

  关键字:基于ASP.NET AJAX的WebPart开发与部署

 

本文中的信息都是收集来的,来源很多,无法一一列出,望见谅。内容仅作为个人的知识管理。
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
  添加 <sectionGroup>元素到  <configSections>标记: <configSections>
       <sectionGroup name=system.web.extensions type=System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35>
      <sectionGroup name=scripting type=System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35>
          <section name=scriptResourceHandler type=System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 requirePermission=false allowDefinition=MachineToApplication/>
        <sectionGroup name=webServices type=System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35>
          <section name=jsonSerialization type=System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 requirePermission=false allowDefinition=Everywhere />
          <section name=profileService type=System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 requirePermission=false allowDefinition=MachineToApplication />
          <section name=authenticationService type=System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 requirePermission=false allowDefinition=MachineToApplication />
        </sectionGroup>
      </sectionGroup>
    </sectionGroup>
</configSections>
添加 <controls> 节的内容,放在 <system.web>/<pages> 标记中。     <pages>
      <controls>
        <add tagPrefix=asp namespace=System.Web.UI assembly=System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35/>
      </controls>
    </pages>   
在<compilation>标记内的<assemblies> 标记中添加下面的内容:       <assemblies>
       <add assembly=System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35/>
      </assemblies>
在 <httpHandlers> 节中添加下面的内容:  <httpHandlers>
      <add verb=* path=*.asmx validate=false type=System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35/>
      <add verb=* path=*_AppService.axd validate=false type=System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35/>
      <add verb=GET,HEAD path=ScriptResource.axd type=System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 validate=false/>
  </httpHandlers>
在 HttpModules 节中添加下面的注册内容,放在所有已有的注册内容下面   <httpModules>
      <add name=ScriptModule type=System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35/>
  </httpModules>
在<SharePoint>/<SafeControls>节中,添加一条 SafeControl ,用于 Microsoft Ajax Extensions的System.Web.UI命名空间。   <SafeControls>
      <SafeControl Assembly=System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 Namespace=System.Web.UI TypeName=* Safe=True />
  </SafeControls>
最后,添加下面的 configuration标记到 web.config文件末尾, 在结束标记<configuration>前面。
  <system.web.extensions>
    <scripting>
      <webServices>
      <!-- Uncomment this line to enable the authentication service. Include requireSSL=true if appropriate. -->
      <!--
        <authenticationService enabled=true requireSSL = true|false/>
      -->
      <!-- Uncomment these lines to enable the profile service. To allow profile properties to be retrieved and modified in ASP.NET AJAX applications, you need to add each property name to the readAccessProperties and writeAccessProperties attributes. -->
      <!--
      <profileService enabled=true
                      readAccessProperties=propertyname1,propertyname2
                      writeAccessProperties=propertyname1,propertyname2 />
      -->
      </webServices>
      <!--
      <scriptResourceHandler enableCompression=true enableCaching=true />
      -->
    </scripting>
  </system.web.extensions>
  <system.webServer>
    <validation validateIntegratedModeConfiguration=false/>
    <modules>
      <add name=ScriptModule preCondition=integratedMode type=System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35/>
    </modules>
    <handlers>
      <remove name=WebServiceHandlerFactory-Integrated />
      <add name=ScriptHandlerFactory verb=* path=*.asmx preCondition=integratedMode
           type=System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35/>
      <add name=ScriptHandlerFactoryAppServices verb=* path=*_AppService.axd preCondition=integratedMode type=System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35/>
      <add name=ScriptResource preCondition=integratedMode verb=GET,HEAD path=ScriptResource.axd type=System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 />
    </handlers>
  </system.webServer>
利用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类的实现部分:
      /// <summary>
    /// A base class that implements all the functionality required to use ASP.net Ajax extensions inside WSS
    /// </summary>
    [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
        /// <summary>
        /// Used to provide a common way to display errors to the user of the current web part.
        /// </summary>
        /// <param name=message>Description of the error that occured.</param>
        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.);
            }
        }
        /// <summary>
        /// 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.
        /// </summary>
        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
        /// <summary>
        /// Oninit fires before page load. Modifications to the page that are necessary to support Ajax are done here.
        /// </summary>
        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:onsubmit val:return _spFormOnSubmitWrapper() blocks async postbacks after the first one
                //not calling _spFormOnSubmitWrapper() breaks all postbacks
                //returning true all the time, somewhat defeats the purpose of the _spFormOnSubmitWrapper() 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 formOnSubmitAtt = this.Page.Form.Attributes[onsubmit];
                    if (!string.IsNullOrEmpty(formOnSubmitAtt) && formOnSubmitAtt == return _spFormOnSubmitWrapper();)
                    {
                        this.Page.Form.Attributes[onsubmit] = _spFormOnSubmitWrapper();;
                    }

                    //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
        /// <summary>
        /// Exposes the Pages script manager. The value is not set until after OnInit
        /// </summary>
        [WebPartStorage(Storage.None)]
        public ScriptManager AjaxManager
        {
            get { return _AjaxManager; }
            set { _AjaxManager = value; }
        }
        #endregion
    }
开发时只要继承这个WebPart就可以添加UpdatePanel,并在里面添加其他控件了。


基于ASP.NET AJAX的WebPart开发与部署
  • 上一篇文章:

  • 下一篇文章:
  •  热门文章
    普通文章 电子邮件改头换面 四公司畅谈未
    普通文章 PC病毒史上最声名狼藉的八大病
    普通文章 Rails系统中的AJAX开发技术简析
    普通文章 基于ASP.NET AJAX框架实现表单
    普通文章 开发ASP.NET AJAX客户端定制行
    普通文章 用JFreeChart对JSP报表进行增强
    普通文章 SQL Server 2005上的CLR和ADO.
    普通文章 SQL Server 2005的XML支持机制
    普通文章 Firefox中标签式浏览技巧大全
    普通文章 Tomcat中的Session和Cookie大揭
     
     推荐文章
    推荐文章 把Google地图嵌入网页 就是这么
    推荐文章 迅雷搜索候选资源出错的解决
    推荐文章 轻松去除迅雷里的各种广告和资
    推荐文章 突破限制 免费领养到QQ空间五级
    推荐文章 Rational统一过程RUP贴近中小软
    推荐文章 构建自己的轻量级XML DOM分析程
    推荐文章 WPS Office 2007技巧:妙用配置
    推荐文章 Excel 2007:求余数函数实用进阶
    推荐文章 浅谈ASP.NET的Postback
    推荐文章 软件开发中项目需求管理简述
     
     相关文章
    没有相关文章
    设为首页 | 加入收藏 | 广告合作 | 联系站长 | 版权申明 |
    动力中国为网友提供免费学习资料,可用资源,如果您认为我们的相关内容侵害到了您的权利请联系管理员
    Copyright © 2006-2008 domcn.org All Rights Reserved.