ASP.NET AJAX入门系列(9):在母版页中使用UpdatePanel

本文简单介绍一下在母版页中使用UpdatePanel控件,翻译自官方文档。

 

主要内容

1.添加UpdatePanel控件到Content Page

2.通过Master Page刷新UpdatePanel

 

一.添加UpdatePanel控件到Content-Page

1.添加一个新的Master Page,并切换到设计视图。

2.在工具箱中AJAX Extensions标签下双击ScriptManager控件添加到页面中,确保ScriptManager控件添加在ContentPlaceHolder控件之外。

3.在ContentPlaceHolder控件添加文本“Master Page”。

4.在工具箱的HTML标签下,拖动Horizontal Rule(横线)到文本之后,页面如下:

5.创建一个Content Page,选择它的Master Page为我们刚才创建的页面。

在解决方案管理器中点击右键,并选择Add New Item菜单命令,在Add New Item对话框中选择Select master page复选矿,并单击OK按钮。

6.在Content页面中的Content控件中输入Content Page,并添加一个UpdatePanel控件。

7.在UpdatePanel控件中添加Calendar控件。

8.保存并按Ctrl + F5运行。

9.单击Calendar控件中的上月和下月按钮,页面并没有整页刷新。

二.通过Master Page刷新UpdatePanel

在该例子中我们将在Master Page中添加一些控件,它们将引发一个异步提交,同时在Content页面中刷新UpdatePanel

1.在Master Page中切换到设计视图。

2.添加一些文本和两个按钮到页面中,设置一个按钮的ID属性和Text属性分别为DecrementButton和“-”,设置另一个按钮的ID属性和Text属性分别为IncrementButton和“+”。

3.选择+按钮,在属性窗口的Click事件框中输入MasterButton_Click,对-按钮再重复做一次。

4.在控件之外双击页面添加Page_Load事件处理。

5.在Page_Load事件处理中添加如下代码,注册两个按钮为异步提交按钮。

protected void Page_Load(object sender, EventArgs e)

{
    ScriptManager1.RegisterAsyncPostBackControl(DecrementButton);

    ScriptManager1.RegisterAsyncPostBackControl(IncrementButton);

}

6.添加如下代码创建一个MasterButton_Click事件处理。

protected void MasterButton_Click(object sender, EventArgs e)
{
    
switch (((Control)sender).ID)
    
{
        
case "IncrementButton":

            
this.Offset = this.Offset + 1;

            
break;

        
case "DecrementButton":

            
this.Offset = this.Offset - 1;

            
break;
    }


    ((UpdatePanel)ContentPlaceHolder1.FindControl(
"UpdatePanel1")).Update();

    Calendar cal 
= ((Calendar)ContentPlaceHolder1.FindControl("Calendar1"));

    DateTime newDateTime 
= DateTime.Today.Add(new TimeSpan(Offset, 000));

    cal.SelectedDate 
= newDateTime;

}

7.在Master Page中创建一个公有的属性Offset,来显示所选择的日期和当天之差。

public Int32 Offset
{
    
get
    
return (Int32)(ViewState["Offset"?? 0); }

    
set
    
{ ViewState["Offset"= value; }
}

8.在Content Page中,切换到设计视图并双击Calendar控件添加一个SelectionChanged事件处理,当用户选择日期时设置Offset属性。

9.添加如下代码到SelectionChanged事件处理中。

protected void Calendar1_SelectionChanged(object sender,EventArgs e)
{
    DateTime selectedDate 
= Calendar1.SelectedDate;

    Master.Offset 
=

       ((TimeSpan)Calendar1.SelectedDate.Subtract(

       DateTime.Today)).Days;
}

10.在Content Page页面的Page_Load事件中添加如下代码。

protected void Page_Load(object sender, EventArgs e)
{
    DateTime newDateTime 
=

        DateTime.Today.Add(
new

        TimeSpan(Master.Offset, 
000));

    Calendar1.SelectedDate 
= newDateTime;
}

11.添加@ MasterType标记到页面中,以便可以作为强类型属性引用Master Page页面的Offset属性。

<%@ MasterType VirtualPath="MasterPage.master" %>

12.在Content Page中切换到设计视图,并选择UpdatePanel控件。

13.在属性窗口中设置UpdateModeConditional

14.保存并按Ctrl + F5运行。

15.在Calendar控件中单击上一月和下一月按钮,可以看到整页刷新。

16.选择一个日期并单击Master Page中的按钮,可以看到仍然没有整页刷新。

[翻译自官方文档]

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2006-11-13 18:00 TerryLee 阅读(20752) 评论(80) 编辑 收藏

 回复 引用 查看   
#1楼 2006-11-13 18:12 阿一      
李大哥你说的让人容易接受,听听你讲的,再结合自己平时所用的,
就更加深刻,虽然平时自己也在研究,但我就是死活写不出文章来,
唉,看来我得回去进修语文了。

 回复 引用 查看   
#2楼[楼主] 2006-11-13 19:23 TerryLee      
@阿一
呵呵,平时在博客上多锻炼一些,就会写好:)

 回复 引用   
#3楼 2006-11-13 20:43 sunlife[匿名]
HI, TerryLee 大哥,不好意思,我在这问你点关于Castle这个开源项目的问题,我下载了源码,在编译时总是有错误(对程序集“C:\Program Files\CastleProject\Source Code\castle-sourcecode\Core\Castle.Core\obj\Debug\Castle.Core.dll”签名时加密失败 --“读取密钥文件“../../CastleKey.snk”时出错 -- 系统找不到指定的文件。 ” Castle.Core-vs2005),请问一下,这个应该如何解决?

 回复 引用 查看   
#4楼 2006-11-13 21:55 Hunts.C      
这次是这个错误:找不到类型或命名空间名称“UpdatePanel”(是否缺少 using 指令或程序集引用?)
唉~

 回复 引用 查看   
#5楼[楼主] 2006-11-14 08:45 TerryLee      
@Hunts.C
在后台.CS代码中需要引入命名空间

 回复 引用 查看   
#6楼[楼主] 2006-11-14 08:48 TerryLee      
@sunlife[匿名]
下载安装后在C:\Program Files\CastleProject\Source Code文件夹下有两个密钥文件:
ApacheAvalon.snk
CastleKey.snk

你看一下有没有?应该都有的

 回复 引用   
#7楼 2006-11-14 10:50 charming[匿名][未注册用户]
go go go... :)
 回复 引用 查看   
#8楼[楼主] 2006-11-15 12:57 TerryLee      
@charming[匿名]
:)

 回复 引用   
#9楼 2006-11-15 15:25 sheva.wen[匿名][未注册用户]
找不到类型或命名空间名称“UpdatePanel”(是否缺少 using 指令或程序集引用?)
“在后台.CS代码中需要引入命名空间”
是什么?


 回复 引用 查看   
#11楼[楼主] 2006-11-15 20:08 TerryLee      
@sheva.wen[匿名]
using Microsoft.Web.UI;

 回复 引用   
#12楼 2006-11-16 17:31 AJAX入门[未注册用户]
.Update(); 出不来啊。
 回复 引用   
#13楼 2006-11-16 21:20 hm[未注册用户]
李大哥你又忘贴代码的下载地址了,我照你写的做复制代码有错误,下面这个代码有错误着么有两个??啊
public Int32 Offset
{
get
{ return (Int32)(ViewState["Offset"] ?? 0); }

set
{ ViewState["Offset"] = value; }
}

 回复 引用   
#14楼 2006-11-17 09:43 AJAX入门[未注册用户]
@hm

操作符??
C# 2.0提出能对nullable类型进行操作的新操作符“??”(双问号)。这个操作符允许将nullable类型重新指定为非nullable类型,并且如果nullable类型的值是null,还可以重新定义值。

 回复 引用   
#15楼 2006-11-17 14:08 阿蒙[匿名][未注册用户]
T大

MasterButton_Click方法中的

((UpdatePanel)ContentPlaceHolder1.FindControl("UpdatePanel1")).Update();

这句代码,是否应该在方法代码的最后面呀?


 回复 引用   
#16楼 2006-11-17 14:13 阿蒙[匿名][未注册用户]
好像放在前后都可以玩:)
 回复 引用 查看   
#17楼[楼主] 2006-11-18 18:02 TerryLee      
@阿蒙[匿名]
应该是都可以,官方文档上的例子就是这样写的

 回复 引用 查看   
#18楼[楼主] 2006-11-18 18:03 TerryLee      
@hm
AJAX入门已经给出了答案

@AJAX入门
谢谢:)

 回复 引用   
#19楼 2006-11-19 16:30 kingcat[未注册用户]
我把9篇都看完了。实在是写的太好了。太感谢了!
 回复 引用   
#20楼 2006-11-19 20:34 Hm[未注册用户]
@AJAX入门,TerryLee
谢谢你们,学到了

 回复 引用 查看   
#21楼[楼主] 2006-11-19 21:43 TerryLee      
@kingcat
太客气了:)

 回复 引用 查看   
#22楼[楼主] 2006-11-19 21:44 TerryLee      
@Hm
:)

 回复 引用 查看   
#23楼 2006-11-20 15:49 ColdDog      
全部看完了,上午8点开始看到现在...继续关注中
 回复 引用   
#24楼 2006-11-22 01:03 立冬[匿名][未注册用户]
弱弱地问一下:这个例子主要为了说明什么问题?
我没有看明白,在母版页中控制子页(点击-+)不全页刷新可以理解,但为什么要使得在子页中点上下月反而全页刷新呢?

 回复 引用 查看   
#25楼[楼主] 2006-11-23 21:09 TerryLee      
@立冬[匿名]
文章的题目已经说明了,在母版页中使用UpdatePanel:)

 回复 引用   
#26楼 2006-11-24 11:08 David Liao[未注册用户]
TerryLee 大哥,有个问题想请教你一下.

我用VS2005插入table到控制子页的<contenttemplate>里,但里面的代码会是大写,而且没有分行显示,看起来很吃力..

<asp:UpdatePanel id="UpdatePanel1" runat="server">
<contenttemplate>
<TABLE><TBODY><TR><TD style="WIDTH: 100px"></TD></TR></TBODY></TABLE>
</contenttemplate>
</asp:UpdatePanel>

但运行起来是没正常的.
不知这样的情况可以调试么?

 回复 引用   
#27楼 2006-11-24 11:11 David Liao[未注册用户]
但运行起来是正常的.
 回复 引用   
#28楼 2006-12-13 22:12 daniel[匿名][未注册用户]
阁下写的文章不错,真适合去当老师赚外块,或者出版些书赚钱也行,写程序真是亏了
 回复 引用 查看   
#29楼[楼主] 2006-12-14 23:53 TerryLee      
@David Liao
在编辑菜单中,选择高级-格式化一下代码看看

 回复 引用 查看   
#30楼[楼主] 2006-12-14 23:53 TerryLee      
@daniel[匿名]
看情况吧,还是得先提高自己

 回复 引用   
#31楼 2006-12-18 17:07 IFOSEN[匿名][未注册用户]
Words can't not express my apreciation for you,Mr. Li.
All the best~

 回复 引用 查看   
#32楼 2006-12-20 16:36 Anthan      
为什么我做出来的在Calendar控件中单击上一月和下一月按钮,没有整页刷新,还是刷的太快了,我没看到?



 回复 引用   
#33楼 2006-12-21 03:32 [匿名] [未注册用户]
@Anthan,

No whole page refresh when clicking previous month or next month buttons.

@TerryLee
The translation for "15.在Calendar控件中单击上一月和下一月按钮,可以看到整页刷新。" is not correct. There is no whole page refresh.


 回复 引用 查看   
#34楼 2006-12-21 16:54 ddr888      
用atlas做好了网站,放到虚拟主机上需要虚拟主机安装什么或者说什么要求嚒?
 回复 引用 查看   
#35楼[楼主] 2006-12-23 16:31 TerryLee      
@[匿名]
sorry~~~~

 回复 引用 查看   
#36楼[楼主] 2006-12-23 16:32 TerryLee      
@ddr888
可以把dll拷贝到bin目录下

 回复 引用 查看   
#37楼[楼主] 2006-12-23 16:32 TerryLee      
@ddr888
或者参考老赵写的一篇相关文章

 回复 引用 查看   
#38楼 2006-12-24 18:18 丹心猪(Dansinge)      
学好了,按上下月是没整页刷新的
 回复 引用 查看   
#39楼[楼主] 2006-12-24 19:29 TerryLee      
@丹心猪(Dansinge)
:)

 回复 引用   
#40楼 2007-01-17 16:31 初吻给了烟[未注册用户]
我有点不懂,为什么要这样做呢?直接用母版不也一样吗?
 回复 引用 查看   
#41楼 2007-02-05 11:01 Nina      
為什麼我的還是整頁刷新呢?
html提示說sys沒定義?

 回复 引用   
#42楼 2007-03-04 13:11 zz[未注册用户]
我在母板页中有个TREEVIEW导航,每次点treeview的时候切换到新的页面的时候整个页面都要刷新(包括treeview也重新刷新了),有没有办法让母板页不刷新而只是内容控件中刷新 ?谢谢了
 回复 引用 查看   
#43楼 2007-03-12 09:28 Nina      
有沒有這個實例,讓我好好的研究一下啊,我還是正也刷新,一運行服務器control就刷新,跟沒用altas是一樣的
 回复 引用   
#44楼 2007-03-12 10:43 yuki[未注册用户]
李大哥的文章很有针对性,继续关注ing
 回复 引用   
#45楼 2007-03-22 11:03 kuangrun[未注册用户]
李大哥的asp.net ajax我在关注中,这里有个问题:我按照上面做完后都不整页刷新,是不是那搞错啦
 回复 引用 查看   
#46楼 2007-03-26 15:15 扑街仔      
很奇怪..我 无论是 母版还是子页都不 全页更新吖?怎么回事?

 回复 引用   
#47楼 2007-05-02 18:55 xywhnh[未注册用户]
楼主说例子是在母版页添加按纽,现在我遇到的问题是在母版页有一个TreeView,我想用这个TreeView控制内容页中的内容,请问代码该如何加?怎么把TreeView注册成异步的呢?TreeView 有很多节点的,每个节点都转向一个页面.请各位高手给点提示吧,这个问题我想了好久了,都找不到解决办法!这里先谢了!
我的QQ是:179865967
邮箱:xywhnh@163.com

 回复 引用   
#48楼 2007-05-26 16:42 daijun[未注册用户]
谢谢你的文章,官方的文档把我头都搞大了。学到东西了。这篇就是解决不刷新母模板,只刷新Content页面部分。
楼上的几位不明白的话,可以再慢慢看下,李老大都说的很清楚明白了。

可不可以贴出原文出处???????????????????????????????????????????????????????????????????????
 回复 引用   
#50楼 2007-09-26 11:59 杏子[未注册用户]
--引用--------------------------------------------------
xywhnh: 楼主说例子是在母版页添加按纽,现在我遇到的问题是在母版页有一个TreeView,我想用这个TreeView控制内容页中的内容,请问代码该如何加?怎么把TreeView注册成异步的呢?TreeView 有很多节点的,每个节点都转向一个页面.请各位高手给点提示吧,这个问题我想了好久了,都找不到解决办法!这里先谢了!
我的QQ是:179865967
邮箱:xywhnh@163.com
--------------------------------------------------------
我也是这个问题也 帮忙解决 qq:279874449

 回复 引用   
#51楼 2007-12-24 10:50 蒋新[未注册用户]
15.在Calendar控件中单击上一月和下一月按钮,可以看到整页刷新。
这里是不是说错了.应是:"在Calendar控件中单击上一月和下一月按钮,可以看到没有整页刷新。"

 回复 引用   
#52楼 2008-05-07 14:02 Suker[未注册用户]
楼主的文章写得很好啊...关键在于很通俗...看了以后学到了不少东西呢~谢谢!!!
李大哥。我要问一个问题。就是一个母版页中左边是TREEVIEW,,右边是要显示的GRIDVIEW(当然这是另一个页中的。是嵌入ContentPlaceHolder里的),点击左边TreeView中的一个Node(Node有一个连接)。左边不刷新,右边(ContentPlaceHolder里)显示出GridView,如何用UpdatePanel实现啊。。。。谢谢。再次感谢。。。。。
 回复 引用   
#54楼 2008-06-18 17:59 wind-zx[未注册用户]
请问 UpdatePanel 中可以有几个
contenttemplate

contenttemplate与UpdatePanel 有什么关系? 谢谢

 回复 引用   
#55楼 2008-09-01 16:20 Peng_sunshine[未注册用户]
楼主,问个问题。我想在现有的asp.net web应用程序下使用局部刷新。
已按步骤完成ajax运行环境配置。之后在web应用程序中做如下改动:
1 web.config的配置
2 建立bin文件夹,添加System.Web.Extensions.dll以及AjaxControlToolkit.dll
3 在母版页中添加一个ScriptManager控件
4 在内容页中添加updatepanel并在UpdatePanel中的contenttemplate中加入一个table。

一开始页面没有问题,运行正常,但有时出现错误类型如下:
1 错误 36 无法识别的标记前缀或设备筛选器“__designer”。
2 错误 36 元素“UpdatePanel”不是已知元素。原因可能是网站中存在编译错误。
3 table里的代码都变成大写,没有分行显示。
但是运行一切正常,更奇怪的是错误1和2是有时出现。望老师抽空给予解答,发我邮箱,谢谢!

 回复 引用 查看   
#56楼[楼主] 2008-09-01 22:05 TerryLee      
@Peng_sunshine
如果Web.config配置正常的花,应该不会有这些问题,感觉不像是程序的问题,可能跟你的环境有关。

 回复 引用   
#57楼 2008-09-02 16:43 Peng_sunshine[未注册用户]
@TerryLee
对了 还有一个错误就是
验证 (Internet Explorer 6): 不支持元素“contenttemplate”。
我的webconfig配置参考了ajax网页里的

后来我建立了一个ajax网页 把我的普通asp.net web程序项目拷到了ajax下
在webconfig里只设置了sitemap 和connectionstring节点 其他没动。程序起初也是可以运行的,一切正常。 后来就出现了以前的错误。

还有我装了ajax futures ctp 可还是不行。


 回复 引用   
#58楼 2008-12-24 14:10 啊啊啊[未注册用户]
15.在Calendar控件中单击上一月和下一月按钮,可以看到整页刷新。

这句应该是整页没有刷新。

 回复 引用 查看   
#59楼[楼主] 2008-12-25 15:13 TerryLee      
@啊啊啊
呵呵,其实本示例想测试的是在Master中使用UpdatePanel……

 回复 引用   
#60楼 2008-12-30 11:01 pizixie[未注册用户]
呵呵 @TerryLee
你可真负责。。。 这么久的帖子你还会慢慢看。。。

 回复 引用 查看   
#61楼[楼主] 2009-01-04 11:24 TerryLee      
@pizixie
我想尽量做到对每一个评论都回复,但有时候经常遗漏,所以还是不够负责,呵呵

 回复 引用   
#62楼 2009-01-09 11:03 游客512[未注册用户]
狂顶!举例生动!
遗憾的是没有示例代码下载,还要自己编写代码,麻烦!!!!!

 回复 引用 查看   
#63楼[楼主] 2009-01-12 11:25 TerryLee      
@游客512
没提供下载,就是想大家亲自动手做一下

 回复 引用   
#64楼 2009-02-20 09:40 asp.net爱好者[未注册用户]
根据楼主的示例,再结合自己的实际修改下,可以只刷新母板页的UpdatePanel,也可以同步刷新,谢谢!
 回复 引用   
#65楼 2009-05-21 17:34 NightCat[未注册用户]
受楼主这句话指引,特回帖.
另,楼主文章写的很好,赞一个!

--引用--------------------------------------------------
TerryLee: @pizixie
我想尽量做到对每一个评论都回复,但有时候经常遗漏,所以还是不够负责,呵呵
--------------------------------------------------------

 回复 引用 查看   
#66楼[楼主] 2009-05-22 13:44 TerryLee      
@NightCat
:P

 回复 引用 查看   
#67楼 2009-07-16 16:34 Aloner      
很郁闷外国人的写法。
为什么总喜欢先把OFFSET些出来,然后再去写OFFSET 属性?无语……

 回复 引用 查看   
#68楼 2009-07-16 16:34 Aloner      
很郁闷外国人的写法。
为什么总喜欢先把OFFSET些出来,然后再去写OFFSET 属性?无语……

 回复 引用 查看   
#69楼 2009-09-09 10:17 yuzhiwusfm      
为什么我做出来的在Calendar控件中单击上一月和下一月按钮,没有整页刷新