ASP.NET AJAX -- 异步-动态生成简单样式栏目

点击这里Q我!

ASP.NET AJAX 是一個不受拘束的架构,可让您快速地在所有常见的浏览器上,建立更有效率、更互动式、更高度个人化的新一代网页经验。

使用 ASP.NET AJAX,您可以:

  • 以可重复使用的 AJAX 元件建立新一代界面。
  • 透过可支援所有現今浏览器的强大 AJAX 控制项,以加强現有网页。
  • 持续使用 Visual Studio 2005,讓您的 ASP.NET 2.0 网站更上层楼。
  • 直接从浏览器存取远端服务与资料,完全不需撰写复杂的指令码。
  • 以 Microsoft 提供的技术支援,享受不受拘束架构的好处。

查看本文,您需要对一下技术有一定的了解:

       C#编程,xhtml标准,css2.0标准,asp.net 页面模型, asp.net ajax library 类库对javascript 的封装(面向对象的javascript),JSON对象操作,UML基础。

示例简介:

       一个能够在ie7,firefox及各种主流的浏览器上都能正确显示的栏目组件。

                                 

一    为了你们能对我的程序设计有更清晰的认识,首先看一下我为你们展示的程序执行顺序图:

这个顺序图主要由五大对象组成:

       AjaxPage(ajax页面,发出请求的主要对象),

       webRequest(得到页面请求,组装一个请求,并服务器提出请求,再获得回应),

       ServerHandler(服务器端的请求处理者,并回发一个请求),

       json(javascript序列化对象,把一个服务器对象序列化为客户端识别的字符串),

      caption (服务器端的实体对象)

二   AjaxPage页面

    在<form runat="server"></form>标记中我们要放入一个

      <asp:ScriptManager ID="ScriptManager1" runat="server">
            <Scripts>
                <asp:ScriptReference Path="~/js/cap1.js" />
                <asp:ScriptReference Path="~/js/ajax.js" />
            </Scripts>
        </asp:ScriptManager>

这样我们就能用Microsoft的asp.net ajax 中提供的面向对象的javascript编写浏览器兼容的动态代码。里边的

                <asp:ScriptReference Path="~/js/cap1.js" />
                <asp:ScriptReference Path="~/js/ajax.js" />

分别引用的两个自己编写的javascript代码文件。

ajax.js中存放了两个函数,是为了处理AjaxPage异步回发请求。代码如下:

/// <reference name="MicrosoftAjax.js"/>
function sendRequest(handlerfile, verb, onCompletedString)
{
    ///<summery>异步请求发送函数</summery>
    ///<para name="handlerfile">服务器端处理文件路径</parm>
    ///<para name="verb">回传类型GET或POST</parm>
    ///<para name="onCompletedString">回传完成后的相应函数,如果为null我们将会提供一个默认的</parm>
    var webRequest = new Sys.Net.WebRequest();
    webRequest.set_url(handlerfile);
    //    var rebody = 'data=' + encodeURIComponent('这个是发送到的数据!');
    //    webRequest.set_body(rebody);
    //webRequest.get_handers()['content-length'] = rebody.length;
    webRequest.set_httpVerb(verb);
    //webRequest.set_timeout(3000);
    if(onCompletedString === null)
    {
        webRequest.add_completed(onCompleted);
    }
    else
    {
        webRequest.add_completed(onCompletedString);
    }
    webRequest.invoke();
}
function onCompleted(response, eventArgs)
{
    if(response.get_aborted())
    {
        alert('请求被取消!');
        return ;
    }
    if(response.get_responseAvailable())
    {
        var statusCode = response.get_statusCode();
        if(statusCode < 200 || statusCode > 300)
        {
            alert('没有得到正确的结果');
        }
        else
        {
            alert('正常执行结果,但是您没有指定完成后的处理函数');
            //response.get_responseData()
            //response.get_xml();
            //response.get_object();//jeson 对象字符串

        }
        return ;
    }
    if(response.get_timedOut())
    {
        alert('请求超时!');
        return ;
    }
   
    //如果上述条件都没有达到,说明请求出现错误
    alert('错误请求!');
    return ;
}

以上,我写了一个组装请求的函数sendRequest()其中参数都有注释。还有一个就是

onCompleted(response, eventArgs)函数,这个函数表示异步请求完成后我们要做的一些事情,这里我提供给大家的只是个参考。在代码中你可以看到,如果你不提供自己的一个回调函数,就会执行我为您提供的这个回调函数。

cap1.js存放了我自己定义的一个简单的客户端类,主要是为了生成一个控件框架(见第一个图),代码如下:
/// <reference name="MicrosoftAjax.js"/>
Type.registerNamespace("OA");
//构造一个cap1需要一个标题和内容
OA.cap1 = function(tit,context) {
    if(tit === '' || context === '')
    {
        this._tit = '空白栏目';
        this._context = '没有相关内容!';
    }
    else
    {
        this._tit = tit;
        this._context = context;
    }
  
}

OA.cap1.prototype = {
    get_tit : function()
    {
        return this._tit;
    },
    get_context : function()
    {
        return this._context;
    },
    get_style : function()
    {
        return this._style;
    },
    set_tit : function(value)
    {
         this._tit = value;
    },
    set_context : function(value)
    {
        this._context = value;
    },
    set_style : function(cssfilepath)
    {
       var style = document.createElement('link');
       style.rel='stylesheet';
       style.type = 'text/css';
       style.href = cssfilepath;
       document.getElementsByTagName('head')[0].appendChild(style);
    },
    getCap1 : function(div)
    {
        if(div.toString().length < 1)
        {
            return ;
        }
         var frm = new Sys.StringBuilder( '<div class="cap1_top"><div class="cap1_top"><div class="left_top"></div><div id="'+ div +'_tit" class="mid_top"></div>');
              frm.append( '<div class="top_pic"></div><div class="rit_top"></div></div><div class="cap1_mid"><div id="'+div+'_mid_left" class="mid_left"></div>');
              frm.append('<div id="'+div+'_txt" class="cap1_txt"></div><div id="'+div+'_mid_rit" class="mid_left"></div></div><div class="cap1_btm"><div class="btm_left"></div>');
              frm.append('<div id="'+div+'_btm_mid" class="btm_mid"></div><div class="btm_rit"></div></div></div>');
         $get(div).innerHTML = frm;
        
         $get(div+"_tit").innerHTML=this.get_tit();
         $get(div+"_txt").innerHTML= this.get_context();
         var lineh = Sys.UI.DomElement.getBounds($get(div+"_txt")).height;
         $get(div+"_mid_left").style.height = lineh + "px";
         $get(div+"_mid_rit").style.height = lineh + "px";
        
         var cap_width = Sys.UI.DomElement.getBounds($get(div)).width;
         //调整cap1_top的宽度
         $get(div+"_tit").style.width = cap_width - 51 + "px";
         //调整cap1_mid的宽度
         $get(div+"_txt").style.width = cap_width - 10 + "px";
         //调整cap1_btm的宽度
         $get(div+"_btm_mid").style.width = cap_width - 17 + "px";
     }
}

OA.cap1.registerClass('OA.cap1');

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
这样我们就可以在AjaxPage页面上调用这两个文件中的方法来实现异步回传了:首先我们在页面中放一个
        <div id="capdemo" style="background:#eee;width:200px;height:400px;"οnclick="showCap1();"></div>

主要的是这个οnclick="showCap1();代码如下:

      function showCap1()
      {
         sendRequest('Handlers/Handler1.ashx', 'GET', onDivClick);
      }

      function onDivClick(response, eventArgs)
      { 
          if(response.get_responseAvailable())
          {
              var obj = response.get_object();
              var cap = new OA.cap1(obj.Tit, obj.Text);
              cap.set_style('App_Themes/themeg/style1.css');
              cap.getCap1('capdemo');
          }
      }

请把这段代码放在AjaxPage页面的一个<script type="text/javascript"></script>里,这里我还要指出一段有意思的代码cap.set_style('App_Themes/themeg/style1.css');这段代码把我们预先设计好的一个样式表动态的添加到页面的

<head></head>里了(在文章的末尾,我会把样式表文件的代码贴上。)

       三  ServerHandler事件处理程序

       服务器端的事件处理程序很简单。更具webRequest中设置的url,请求传到我们的Handler1.ashx后,服务器会自动调用

    public void ProcessRequest (HttpContext context)
    {
        context.Response.ContentType = "text/plain";

        string text = "<br />adfasdfasdfasdfasdf<br />adfasdfasdfasdfasdf<br />adfasdfasdfasdfasdf<br />adfasdfasdfasdfasdf<br />adfasdfasdfasdfasdf<br />adfasdfasdfasdfasdf<br />adfasdfasdfasdfasdf<br />adfasdfasdfasdfasdf<br />adfasdfasdfasdfasdf<br />adfasdfasdfasdfasdf";
        Caption caption = new Caption("测试控件",text);
        JavaScriptSerializer json = new JavaScriptSerializer();
        context.Response.Write(json.Serialize(caption));
        context.Response.End();
    }

方法。此方法的主要目的就是构造一个Response对象,里边有我们写好的一个json(JavaScriptSerializer )序列化后的caption对象。Caption类是一个很普通的实体类,定义如下:

public class Caption
    {
        public Caption()
        { }

        public Caption(string tit, string text)
        {
            m_tit = tit;
            m_text = text;
        }

        private string m_tit;
        private string m_text;

        public string Tit
        {
            get { return m_tit; }
        }

        public string Text
        {
            get { return m_text; }
        }

    }

这样,我们的代码几乎全部都已经展示完毕。运行程序,点击AjaxPage中的带颜色的层,我们的控件就会出现在上边。

谢谢看完!

css文件代码:

.cap1_top
{
    width:100%;
    }
.left_top
{
    float:left;
    width:7px;
    height:35px;
    background-image:url(sty1/left_top.gif);
    }
   
.mid_top
{
    font-size:14px;
    text-align:left;
    line-height:35px;
    float:left;
    height:35px;
    background-image:url(sty1/mid_top.gif);
    }
.top_pic
{
    float:left;
    width:39px;
    height:35px;
    background-image:url(sty1/top_pic.gif);
    }
.rit_top
{
    float:left;
    width:5px;
    height:35px;
    background-image:url(sty1/rit_top.gif);
    }
.cap1_mid
{
    width:100%;
    margin:0px;
    padding:0px;
    }
.mid_left
{
    float:left;
    width:5px;
    background-image:url(sty1/ver_line.gif);
    }

.cap1_txt
{
    float:left;
    line-height:24px;
    }

.cap1_btm
{
    width:100%;
    }
.btm_left
{
    float:left;
    width:7px;
    height:9px;
    background-image:url(sty1/btm_left.gif);
    }
.btm_mid
{
    float:left;
    height:9px;
    background-image:url(sty1/ali_line.gif);
    }
.btm_rit
{
    float:left;
    width:10px;
    height:9px;
    background-image:url(sty1/btm_rit.gif);
    }

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值