Create a AJAX enabled WebPart for SharePoint2007 by using ASP.NET 2.0 client callback feature

I tried to integrate Atlas into WebPart a couple of days ago but failed. Atlas is a great AJAX framework from Microsoft, but it isn't compatible with SharePoint 2007 for now, what a pity.

But your customers always have this kind of complain, "The page will fully reload when I just click one button in the WebPart, I just wanna perform a very simple action but I have to wait until the page load complete." So, how can you handle this?

As you've known, there is a built-in feature called client callback in ASP.NET 2.0, which allows you call server method from client side without causing the page refresh, and SharePoint2007 is built upon ASP.NET 2.0 framework, so we can use this feature to support AJAX in WebPart.

In the following steps, I'm gonna show you how to get server date from client in a WebPart.
[If you are not familiar with Client Callback feature in ASP.NET 2.0 yet, I strongly recommend you read
this article first]

1. Start up VS.NET 2005 and create a Class Library project.

2. Add System.Web.dll to the project reference.

3. Create a Class with a name you expect, which inherit from System.Web.UI.WebControls.WebParts.WebPart and implement System.Web.UI.ICallbackEventHandler interface.

4. Override CreateChildControls to create some controls.

5. Override OnLoad to regist related JavaScript to client.

6. Override RenderContents or Render to render WebPart to browser.

7. Implement ICallbackEventHandler members.

The source code is here:

None.gifusing  System;
None.gif
using
 System.Text;
None.gif
using
 System.Web.UI;
None.gif
using
 System.Web.UI.HtmlControls;
None.gif
using
 System.Web.UI.WebControls.WebParts;
None.gif
None.gif
namespace
 SPS2007.Research.WebParts
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
{
InBlock.gif    
public class
 AjaxPart : WebPart, ICallbackEventHandler
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif
{
InBlock.gif        
private string
 strCallResult;
InBlock.gif        
private
 HtmlInputText tbResult;
InBlock.gif        
private
 HtmlButton btnCall;
InBlock.gif
InBlock.gif        
public
 AjaxPart()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif
{
InBlock.gif            
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
protected override void CreateChildControls()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif
{
InBlock.gif            
base
.CreateChildControls();
InBlock.gif
InBlock.gif            tbResult 
= new
 HtmlInputText();
InBlock.gif            tbResult.ID 
= "myTextBox"
;
InBlock.gif            btnCall 
= new
 HtmlButton();
InBlock.gif            btnCall.InnerText 
= "GetServerDate"
;
InBlock.gif            btnCall.Attributes.Add(
"OnClick""javascript:InvokeMethod();"
);
InBlock.gif            
this
.Controls.Add(tbResult);
InBlock.gif            
this
.Controls.Add(btnCall);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
protected override void OnLoad(EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif
{
InBlock.gif            
if ((this.Page != null&& !this
.Page.IsCallback)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif
{
InBlock.gif                ClientScriptManager scriptManager 
= this
.Page.ClientScript;
InBlock.gif
InBlock.gif                
string eventRef = scriptManager.GetCallbackEventReference(this"argVal""OnCallComplete""ctxVal""OnErrorOccurs"true
);
InBlock.gif
InBlock.gif                StringBuilder sb 
= new
 StringBuilder();
InBlock.gif
InBlock.gif                sb.Append(
"function InvokeMethod(argVal,ctxVal)"
);
InBlock.gif                sb.Append(Environment.NewLine);
InBlock.gif                sb.Append(
"{"
);
InBlock.gif                sb.Append(Environment.NewLine);
InBlock.gif                sb.Append(eventRef);
InBlock.gif                sb.Append(Environment.NewLine);
InBlock.gif                sb.Append(
"}"
);
InBlock.gif                sb.Append(Environment.NewLine);
InBlock.gif
InBlock.gif                HtmlInputText textBox 
= this.FindControl("myTextBox"as
 HtmlInputText;
InBlock.gif
InBlock.gif                sb.Append(
"function OnCallComplete(result,context)"
);
InBlock.gif                sb.Append(Environment.NewLine);
InBlock.gif                sb.Append(
"{"
);
InBlock.gif                sb.Append(Environment.NewLine);
InBlock.gif                sb.Append(
"document.getElementById(\"" + textBox.ClientID + "\").value = result;"
);
InBlock.gif                sb.Append(Environment.NewLine);
InBlock.gif                sb.Append(
"}"
);
InBlock.gif                sb.Append(Environment.NewLine);
InBlock.gif
InBlock.gif                sb.Append(
"function OnErrorOccurs(err)"
);
InBlock.gif                sb.Append(Environment.NewLine);
InBlock.gif                sb.Append(
"{"
);
InBlock.gif                sb.Append(Environment.NewLine);
InBlock.gif                sb.Append(
"window.status = err;"
);
InBlock.gif                sb.Append(Environment.NewLine);
InBlock.gif                sb.Append(
"}"
);
InBlock.gif                sb.Append(Environment.NewLine);
InBlock.gif
InBlock.gif                scriptManager.RegisterClientScriptBlock(
base.GetType(), "CallBackScript", sb.ToString(), true
);
InBlock.gif                
base
.OnLoad(e);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
protected override void RenderContents(HtmlTextWriter writer)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif
{
InBlock.gif            EnsureChildControls();
InBlock.gif            tbResult.RenderControl(writer);
InBlock.gif            btnCall.RenderControl(writer);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
protected string GetDateTime()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif
{
InBlock.gif            
return DateTime.Now.ToString("MM/dd/yyyy"
);
ExpandedSubBlockEnd.gif        }

InBlock.gif
ContractedSubBlock.gifExpandedSubBlockStart.gif        
Implement ICallbackEventHandler Members#region Implement ICallbackEventHandler Members
InBlock.gif
InBlock.gif        
public string GetCallbackResult()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif
{
InBlock.gif            
return
 strCallResult;
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public void RaiseCallbackEvent(string eventArgument)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif
{
InBlock.gif            strCallResult 
=
 GetDateTime();
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif        
#endregion

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif

Okay, That's it, you can compile the project and deploy your WebPart to sharepoint site. I will give you the instructions about how to deploy a web part if you don't know that.

1. Copy compiled assembly to C:\Inetpub\wwwroot\wss\VirtualDirectories\80\_app_bin, notice that 80 is the virtual directory related to your wss site, you can find the name from IIS MMC.

2. Modify the web.config file under C:\Inetpub\wwwroot\wss\VirtualDirectories\80 directory, add below line to SafeControls section:

<SafeControl Assembly="SPS2007.Research.WebParts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Namespace="SPS2007.Research.WebParts" TypeName="*" />

You probably need to change Assembly and Namespace to accord with your assembly.

3. Execute IISRESET under command line.

4. Then go to Site Settings -> Web parts, click 【New】go to the New Web Parts page, find your web part, click 【Populate Gallery】, after that you can add your web part to a page when you edit a page.

o_20060526.gif

转载于:https://www.cnblogs.com/fengzhimei/archive/2006/05/26/410032.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值