ASP.NET AJAX

AJAX在ASP.NET 3.5中还是刚刚开始,下面把我看到的,记录一下,让自己印象加深一点。

1.ScriptManger控件,字面理解就是脚本管理,它会自己在运行时创建一个脚本文件,我们都知道AJAX是靠XMLHttpRequest与服务器通迅的,所以它自己创建的脚本中也会创建这个,换句话说,它帮我们写了脚本。要实现ASP.NET的AJAX这个控件至少要有一个,也只能有一个;

2.ScriptMangerProxy控件,这个看书上说是当把ScriptManger放在母版页上时,如果内容页面上要改动一些它的状态的话,就在内容页面上放上这个控件,试了一下有些还是不行,比如后面要实现的功能返回历史就不行。感觉ASP.Net的母版做得不是很好一样,比如我要实现Skin的话,只能在内容页面上的Theme,因为内容页面才有Page指令,那如果我有多个内容页面,启不是每个都要设置;

3.UpdatePanel控件,它是一个容器,在与服务器交换的时候,只把它里面的内容回送给服务器,所以当只要回送一部分内容时,就把那些控件放到这里面就行了;

4.Timer,就是定时器,把它放到UpdatePanel中,比如定时更新一个Label,而整个页面不会刷新;

5.UpdateProgress,也是一个容器,不用放在UpdatePanel里面,作用是当UpdatePanel中的某些功能执行时间比较长时,在长时间的等待中显示这个控件里面的内容,比方说一些购物网站当你把鼠标放到一张图片时,它会查询相关信息,有时候会显示一个等待的Gif图片的情况,那么就可以用到这个,不用自己做了,多好啊。

基本上就上面这五个控件,一些常用的功能说一下:

1.关于UpdatePanel,它里面内容都包含在ContentTemplate元素中;还有一个Triggers元素,它的作用,比如我们把一个Label和一个按钮放在UpdatePanel里面,当异步时,会把UpdatePanel里面所有的控件状态都回送到服务器,这样在流量上会多一些,如果我们只是更新Label的内容就可以把按钮放到UpdatePanel外面,这样回送的话就不会把按钮回送到服务器了,这时就要用Triggers元素了,它有两种:AsyncPostBackTrigger和PostBackTrigger,两个区别是一个是异步一个是同步,都有两个属性ControlID和EventName,这个设置可以在VS里面设置,很方便,比如ControlID可以设置为刚刚的那个按钮的ID,然后EventName就是“Click”,表示单击的事件,当是异步的时候就跟把按钮放在UpdatePanel里面一样了。

一个页面上可以放多个UpdatePanel控件,它有个属性UpdateMode,默认是Always,就是只要一发生异步回送时,它都会发生,另一个是Conditional,当有触发时才发生回送。

UpdatePanel默认是不能返回的,比如我在TextBox中输入了两次数据,我想返回上一次的数据,怎么办呢?首先要把ScriptManger的EnableHistory属性设置为True,这里提一下我做的时候把ScriptManger放在母版页面上,当我在内容页面上写代码时,访问不了主页面上的ScriptManger,所以还不如每个内容页面上放一个ScriptManger。然后就要写一点代码记录返回点,ScriptManger的AddHistoryPoint方法,采用的是键值的方法,该方法有两个重载一个适用单个键值,一个适用多个键值。如果有多个键值,需要NameValueCollection对象,比如在按钮的单击事件中记录每回送一次的一个记录点

NameValueCollection myCol = new NameValueCollection();
            myCol.Add("txt", inputname
            myCol.Add("date", dt);
            ScriptManager2.AddHistoryPoint(myCol, "myIndexPoint");

然后需在ScriptManger控件的Navigate事件中写代码,作用时当点浏览器上的返回时,做什么,一般是修改控件的值。给个完整的代码:

protected void Button2_Click(object sender, EventArgs e)//更新Label和TextBox的值
    {
        DateTime dt=DateTime.Now;
        //System.Threading.Thread.Sleep(2500);
        Label5.Text = dt.ToString();
        PopulateFields(TextBox1.Text, Label5.Text);
        
    }
    void PopulateFields(string inputname,string dt)
    {
        if (inputname == null)
        {
            Label7.Text = "Hello here,What Your Name?";
        }
        else
        {
            Label7.Text = "Hello here " + inputname;
        }
        if (ScriptManager2.IsInAsyncPostBack && !ScriptManager2.IsNavigating)
        {
            //ScriptManager2.AddHistoryPoint("myIndexPoint", inputname, "Point " + inputname);
            NameValueCollection myCol = new NameValueCollection();
            myCol.Add("txt", inputname);   
            myCol.Add("date", dt);
            ScriptManager2.AddHistoryPoint(myCol, "myIndexPoint");
            
        }
        else
        {
            TextBox1.Text = inputname;
            Label5.Text = dt;
            Page.Title = "Point " + inputname;
        }
    }
    
    protected void ScriptManager2_Navigate(object sender, HistoryEventArgs e)
    {//把State(也就是用AddHistoryPoint方法记录的状态)的值显示出来
        PopulateFields(e.State["txt"],e.State["date"]);
    }

注意要把UpdatePanel的UpdateMode设置为Always,否则浏览器的标题是改了,当UpdatePanel中的控件的值不会改变的。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值