科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基于ASP.NET AJAX的WebPart开发与部署(3)

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文中的信息都是收集来的,来源很多,无法一一列出,望见谅。内容仅作为个人的知识管理。Windows SharePoint Services v3 基于ASP.NET 2.0构建。

作者:sunmoonfire 来源:blog 2007年9月2日

关键字: WebPart ASP.NET SharePoint SharePoint2007 Office

  • 评论
  • 分享微博
  • 分享邮件
下面是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,并在里面添加其他控件了。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章