ASP.NET 2.0,无刷新页面效果!

“无刷新页面”,只是一种不确切的效果描述(其实还有其他各种方法来实现这个效果),更确切的说法是:在页面上用JavaScript调用服务器端的一个方法,然后处理返回的数据。实现它最标准的方法当然是XMLHTTP。但是,程序员都是懒惰的家伙,每个人都希望能有更方便的方法,或者,更佳的包装。比如,Lostinet的Rane就是对XMLHTTP的一个很好的包装。

终于,在ASP.NET 2.0里面,我们可以轻松的来做到这点了。服务器端任何实现了System.Web.UI.ICallbackEventHandler接口的控件,都可以通过RaiseCallbackEvent()方法来处理从页面上的JS脚本传递过来的请求和数据,处理后,再将结果传回给页面。这项能力的底层仍然是XMLHTTP。

首先来看看JavaScript是如何调用服务器端的方法的:

<script language="javascript" type="text/javascript">
    
function ClientMethod()
    
{
        
//获得服务器控件(ControlName为控件名称)
        var Control = document.getElementById("ControlName"); 
        
//ServerMethod为服务器方法名,<%=SplitChar %>为一特定字符(为了避免参数中带有分割符),
        //Control.value为ServerMethod的参数(即控件的值)
        var arg = "ServerMethod<%=SplitChar %>" + Control.value;
        
//启用一个对服务器端事件的客户端回调
        <%= ClientScript.GetCallbackEventReference(this"arg""Result"""%>;
    }

    
//处理客户端回调结果
    function Result(result)
    
{
        alert(result);
    }

</script>
下面继续来看看服务器端方法:
首先
//定义一个分隔符
public char SplitChar = (char)14;
首先要实现ICallbackEventHandler接口。
public string str_content;
    
public void RaiseCallbackEvent(string the_string)
    
{
        str_content 
= the_string;
    }


    
public string GetCallbackResult()
    
{
        
//拆分由客户端传过来的参数
        string[] parts = str_content.Split(SplitChar);

        
//生成ServerMethod的参数队列
        object[] theArgList = new object[parts.Length - 1];
        
for (int i = 1; i < parts.Length; i++)
        
{
            theArgList[i 
- 1= parts[i];
        }


        
//调用ServerMethod
        return (string)GetType().GetMethod(parts[0]).Invoke(this, theArgList);
    }


    
//  返回指定控件的Html代码
    private string RenderControl(Control control)
    
{
        StringWriter writer 
= new StringWriter(CultureInfo.InvariantCulture);
        HtmlTextWriter Htmlwriter 
= new HtmlTextWriter(writer);

        control.RenderControl(Htmlwriter );
        Htmlwriter .Flush();
        Htmlwriter .Close();

        
return writer .ToString();
    }
posted @ 2006-08-31 10:31  坏坏天堂  阅读(561)  评论(0)    收藏  举报