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中的控件的值不会改变的。