惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Hacker News: Front Page
A
About on SuperTechFans
腾讯CDC
罗磊的独立博客
博客园 - Franky
Last Week in AI
Last Week in AI
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
小众软件
小众软件
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Register - Security
The Register - Security
云风的 BLOG
云风的 BLOG
L
LangChain Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
D
Docker
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recorded Future
Recorded Future
Vercel News
Vercel News
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
J
Java Code Geeks
有赞技术团队
有赞技术团队
V
V2EX
IT之家
IT之家
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
雷峰网
雷峰网
Jina AI
Jina AI
B
Blog RSS Feed
H
Help Net Security
N
Netflix TechBlog - Medium
Latest news
Latest news
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 司徒正美
Y
Y Combinator Blog
人人都是产品经理
人人都是产品经理
Stack Overflow Blog
Stack Overflow Blog
C
Cisco Blogs
Microsoft Security Blog
Microsoft Security Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
大猫的无限游戏
大猫的无限游戏
C
Check Point Blog
P
Proofpoint News Feed
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
N
News and Events Feed by Topic
T
Threatpost

博客园 - 一瞬间

表格隔行换色与鼠标经过变色 - 一瞬间 - 博客园 如何使SharePoint文档库能为PDF文件显示正确的图标 在WSS搜索结果页面中高亮显示搜索关键字 创建WSS站点时自动应用主题 SharePoint 2007 URL地址快速一览表 如何在MOSS2007删除或隐藏列表的下拉工具栏中的栏目 利用DelegateControl包装自定义的用户控件(转) 利用Javascript获取上传文件、图片 - 一瞬间 - 博客园 推荐一下一个Sharepoint的Solution——Sharepoint SmartTools Javascript 中的事件绑定 & FireFox中的透明度 Asp.net常用的一些代码(转载+融合) - 一瞬间 - 博客园 Display data from multiple sources in a single Data View(转office.Microsoft) Sharepoint备用连接 浅谈Silverlight2.0 beta1(5)DataGrid@Silverlight (一) 浅谈Silverlight2.0 beta1(4) Silverlight Deep Zoom 浅谈Silverlight2.0 beta1(3) Silverlight中的UserControl与CustomControl 浅谈Silverlight2.0 beta1(2) 控件属性中的Style与DataTemplate Silverlight中的DOM Access——使用Window.Eval()(翻译) Silverlight2.0中的计时器类DispatcherTimer——不再使用Storyboard计时器
基于ASP.NET Ajax技术的WebPart开发(转)
一瞬间 · 2008-07-10 · via 博客园 - 一瞬间

问题描述:

Ajax技术应用于SharePoint中的WebPart里来实现无刷新的页面的操作,在WebPart中使用UpdatePanel(Ajax技术),但在WebPart里放UpdatePanel控件后并不是所有的控件都可以放在UpdatePanel

解决方法:

Windows SharePoint Services v3 基于ASP.NET 2.0构建(因为在SharePoint Services v3中的所用的公共语言运行时(CLR)和基类库都是用ASP.NET2.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技术带来的好处:

  1. 可以形成一套完整的客户端脚本资源库,并积累一些可重用的部件。
  2. 可以使用 JSON展示我们的Web服务数据, 结果可以很容易的在JavaScript/Ajax应用程序中使用。
  3. 利用扩展中的技术构建WebPart可以提供高交互性的样式,比如一个具备自动完成功能的 textbox.
  4. 在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

  1.   添加 <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> 
  2. 添加 <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>    
  3. 在<compilation>标记内的<assemblies> 标记中添加下面的内容:
          <assemblies> 
           
    <add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
          </assemblies>
  4. 在 <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> 
  5. 在 HttpModules 节中添加下面的注册内容,放在所有已有的注册内容下面
      <httpModules> 
          
    <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      </httpModules>
  6. 在<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>
  7. 最后,添加下面的 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 don't 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 Page's 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,并在UpdatePanel里面添加其他控件了。