随笔-312  评论-12034  文章-2  trackbacks-256
English Version: http://dflying.dflying.net/1/archive/103_atlas_updatepanel_tips_and_faqs.html

好多开发人员将会从UpdatePanel控件开始慢慢接触AtlasUpdatePanel功能强大并且使用简单,同时也拉近了我们和Atlas的距离。

我曾在此发表了一个对UpdatePanel的简要介绍(http://dflying.cnblogs.com/archive/2006/03/25/358547.html)并得到了很多的反馈与问题。我想有必要把这些问题以及有关UpdatePanel的使用技巧总结成一个帖子。希望能有所帮助。在这里感谢阿不,dudu以及所有提出问题或参与讨论的朋友,让我对UpdatePanel有更深的认识。

首先,最重要的事情就是关注Atlas的老家:http://atlas.asp.net/。我们知道Atlas是一个新的,正在开发中的Framework,每月,甚至每周都在发生着变化,所以作为一个Atlas开发人员,经常关注http://atlas.asp.net/是必须的,你会得到最新的消息,最新的特性以及最新的演示程序。对于新手,http://atlas.asp.net/docs提供了AtlasAPIClass文档可作参考(尚未全部完成,请多加关注)。下面还有一些Atlas以及ASP.NET的核心人物的个人网站/blog,同样值得经常访问(英文):

  1. http://blogs.msdn.com/brada/
  2. http://weblogs.asp.net/scottgu/
  3. http://www.nikhilk.net/
  4. http://weblogs.asp.net/bleroy/
  5. http://blogs.msdn.com/jhawk/

Atlas UpdatePanel服务器控件使用技巧:

  1. 务必设定ScriptManager的EnablePartialRendering属性为true。有好多人向我抱怨说他们的UpdatePanel并不以AJAX的方式工作而还是引发普通的整页PostBack,原因就在于没有设定这个属性。
  2. 设定触发UpdatePanel的控件为服务器控件。因为无论ControlValueTrigger还是ControlEventTrigger,指定的属性/事件都是服务器端属性/事件,都只在服务器端属性变化或是服务器端发出事件时才能触发UpdatePanelPostBack
  3. 区别UpdatePanel的两种更新方式AlwaysConditional。请参考:http://dflying.cnblogs.com/archive/2006/03/25/358547.html。我们应该设定正确的更新方式以避免更新不必要更新的Panel,造成不必要的性能/网络开销。
  4. 不要使用UpdatePanel。如果你从头开始建立一个Atlas程序,仅仅使用UpdatePanel来实现AJAX可能并不是最好的选择。UpdatePanel仅仅简单的从头渲染所有的位于ContentTemplate内部的控件,在某些情况下可能非常低效,例如,对于一个包含了一个有相当多结点的TreeView控件的UpdatePanel来说,如果你只是想简单的添加一个新节点,使用UpdatePanel将会从后台取得整个TreeView并重新渲染,远不及仅存储后并把这个新的节点添加到TreeView中来得高效。在这些情况下,你最好考虑使用一些较高级的Atlas客户端控件。当然,这也加大了一些开发的难度。
  5. 在页面的InitComplete事件被引发前必须保证UpdatePanel已经被初始化。也就是说,不能将UpdatePanel放置于比如一个DataListHeaderTemplate中,因为HeaderTemplate中的内容是在Databinding时期才得到的,而这时页面的InitComplete事件早已经结束。
  6. 在UpdatePanel中不要使用Response.Write(); 。这会扰乱UpdatePanel的执行过程。
  7. Atlas的客户端脚本可以使用于任何的开发平台/语言中。例如ASP.NET 1.1,纯HTML甚至PHP,但是像UpdatePanel这样的服务器端控件只能用于ASP.NET 2.0页面中。Atlas的客户端脚本实际上就是一些经过组织的JavaScript文件,当然是与服务器端选用的技术无关的。但当你使用非ASP.NET 2.0环境时,需要手动加入对这些JavaScript文件的引用,因为你无法使用ASP.NET 2.0中的服务器端控件ScriptManager
  8. 小心在UpdatePanel中包含第三方JavaScript实现的组件。开发跨平台的JavaScript Framework是一件很艰巨的任务,在目前的Atlas实现中仍有很多兼容性的问题。让我们期待未来会更好或者干脆现在想办法自己解决吧。

同时,在页面上添加一个UpdateProgress服务器端控件将会使用户了解你的程序在做什么。下面顺便提一些UpdateProgress控件的使用技巧:

  1. 在页面上添加一个且只添加一个UpdateProgress控件UpdateProgress控件应当是一个全局的控件,所有的AJAX操作都会自动地由UpdateProgress控件来处理。想象一下如果Gmail一下子显示了好多个Loading提示,用户一定会不知所措吧。
  2. UpdateProgressTemplate中有一个magic IDabortButton,你可以提供一个服务器端Button或者LinkButton控件并指定IDabortButton,使用户可以取消当前执行的AJAX请求。当然,使用magic ID并不是一个好的设计方法,相信在未来的版本中这个magic ID会被一个类似<CancelTemplate>的东西取代。当然,在当前的Atlas版本中,请记住abortButton

如有错误,还请不吝指正。相关问题也十分欢迎留言探讨。

posted on 2006-04-01 00:00 Dflying Chen 阅读(18321) 评论(125)  编辑 收藏 网摘 所属分类: ASP.NET 综合ASP.NET AJAX (Atlas)

评论:
#1楼 [楼主] 2006-04-01 00:11 | Dflying Chen      
愚人节第一帖:posted on 2006-04-01 00:00…………
  回复  引用  查看    
#2楼  2006-04-01 01:18 | dudu      
好!支持一下!
果然是愚人节第一帖,发表时间竟然这么准!

  回复  引用  查看    
#3楼  2006-04-01 01:38 | AlexHe.cs [未注册用户]
要如何指定UpdateProgress的位置啊
  回复  引用    
#4楼 [楼主] 2006-04-01 08:48 | Dflying Chen      
@AlexHe.cs
UpdateProgress就是普通的Server control,可以使用CSS或者Table来控制位置。

  回复  引用  查看    
#5楼 [楼主] 2006-04-01 09:13 | Dflying Chen      
@dudu
其实只是随便发了一帖,没想到碰到了

  回复  引用  查看    
#6楼  2006-04-01 13:09 | didasoft      
支持,正在学习Atlas。。。。
  回复  引用  查看    
#7楼  2006-04-01 13:33 | 阿不      
就文中提到的关于TreeView控件,目前还没有什么更好的办法.也不知道Dflying Chen有没有什么实现的好方法,据我了解,就算是客户端组件也没有这个控件,在4月份会发布一个Atlas的控件包,不知道有没有包含Tree控件.
  回复  引用  查看    
#8楼  2006-04-01 16:34 | shalala      
希望可以更多地看到客户端+web服务的介绍。前几天看了MusicMix的Demo,感觉一头雾水。
  回复  引用  查看    
#9楼 [楼主] 2006-04-01 18:40 | Dflying Chen      
@阿不
关于TreeView,我想可否通过继承添加一些客户端的行为。至于那个Atlas控件包,估计暂时不会包含客户端TreeView的。

  回复  引用  查看    
#10楼 [楼主] 2006-04-01 18:41 | Dflying Chen      
@shalala
@didasoft
我会尽可能写一点心得体会。谢谢关注。

  回复  引用  查看    
#11楼  2006-04-17 11:04 | 思考中{OO}      
@Dflying Chen
我使用了UpdatePanel把一个GridView包起来后结果GridView里面的所有事件都不再触发了,显示如下脚本错误,请问有解决的办法吗?
------------------
Line:1
Char:1
Code:0
Error:缺少对象
URL:http://xxxxxxxxxx
-------------------

  回复  引用  查看    
#12楼 [楼主] 2006-04-17 11:35 | Dflying Chen      
@思考中{OO}
您具体的代码是什么样子的呢?

  回复  引用  查看    
#13楼  2006-04-17 13:32 | 思考中{OO}      
经过研究发现了一个问题,我的GridView里边的数据是通过其它按钮事件利用UpdatePanel无刷新绑定进去的,在页面上也正常显示出来了,但查看HTML源代码的时候在该区域却没有相关的数据,只显示 <div id="MessageBox1_up2"><div> ("MessageBox"是页面的名称,"up2"是UpdatePanel的ID),我想这就是为什么脚本错误提示说"缺少对象的原因了,可是这部分数据是保存在那里的呢?又是以什么方式在页面上显示出来的?
  回复  引用  查看    
#14楼  2006-04-17 13:47 | 思考中{OO}      
下面是我的源代码,为了便于阅读,有意省略了一部分无关紧要的代码,我要做的是以无刷新的方式实现一个站内用户的短消息箱, 很谢谢你的热心,每次都能很快地收到你的回复
 

  回复  引用  查看    
#15楼 [楼主] 2006-04-17 14:51 | Dflying Chen      
我觉得您的这种情况完全可以使用一个UpdatePanel实现,大概实现方法如下:
<asp:ImageButton ID="ImageButtonInbox" runat="server" ToolTip="收件箱" />
<atlas:UpdatePanel ID="up1" runat="server">
  
<Triggers>
    
<atlas:ControlEventTrigger ControlID="ImageButtonInbox" EventName="Click" />
  
</Triggers>
  
<ContentTemplate>
    
<asp:GridView />
  
</ContentTemplate>
</atlas:UpdatePanel> 


  回复  引用  查看    
#16楼  2006-04-17 20:45 | 刀 [未注册用户]
我使用了UpdatePanel把一个GridView包起来后,点击GridView中的编辑按钮,其中的事件代码都执行,单与GridView中的列值相对应的textbox却不刷新,why?
  回复  引用    
#17楼  2006-04-17 20:45 | 刀 [未注册用户]
我使用了UpdatePanel把一个GridView包起来后,点击GridView中的编辑按钮,其中的事件代码都执行,单与GridView中的列值相对应的textbox却不刷新,why?
  回复  引用    
#18楼 [楼主] 2006-04-17 20:51 | Dflying Chen      
@刀
我没懂您的意思,能否详细说明一下?
特别是“单与GridView中的列值相对应的textbox却不刷新”

  回复  引用  查看    
#19楼  2006-04-17 20:54 | 刀 [未注册用户]
就是点GridView中的编辑按钮,需要把这一行的所有数据分别赋给不同的textbox
  回复  引用    
#20楼  2006-04-17 21:00 | 刀 [未注册用户]
跟踪代码,textbox赋值的代码执行了,可界面不更新
  回复  引用    
#21楼 [楼主] 2006-04-17 21:03 | Dflying Chen      
@刀
还是不太懂您的意思,能否贴上示例代码?

  回复  引用  查看    
#22楼  2006-04-17 21:07 | 刀 [未注册用户]
'点击编辑按钮
Protected Sub GridView_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridViewDetails.SelectedIndexChanged
Session("InPlanDetailsID") = GridViewDetails.SelectedValue
Call DetailsBind(Session("InPlanDetailsID"))
End Sub

'明细数据绑定
Public Sub DetailsBind(ByVal id_details As Integer)
Dim dt As New DataTable
dt = DataAccess.GetDataTableBySearch("select * from PlanInPlanDetailsView where InPlanDetailsId = " & id_details)
If Not dt Is Nothing AndAlso dt.Rows.Count > 0 Then
txtNO.Text = dt.Rows(0)("TableNO")
lblName.Text = dt.Rows(0)("Name")
lblModel.Text = dt.Rows(0)("Model")
If Trim(dt.Rows(0)("HandOld")) = "是" Then
chkHandOld.Checked = True
Else
chkHandOld.Checked = False
End If
lblMeasure.Text = dt.Rows(0)("Measure")
txtNumber.Text = dt.Rows(0)("RequireNumber")
txtPurpose.Text = dt.Rows(0)("purpose")
txtMaterialID.Text = dt.Rows(0)("MaterialId")
Call MRPConsultBind(Convert.ToInt32(txtMaterialID.Text))

Else
Call Clear()

End If
End Sub

  回复  引用    
#23楼  2006-04-17 21:13 | 鍒€ [未注册用户]
这些代码都正确执行了,但是象“txtPurpose.Text”的值在界面上不更新
  回复  引用    
#24楼 [楼主] 2006-04-17 21:15 | Dflying Chen      
@刀
您的意思是在DetailsView中也要刷新对么?
如果是这样的话,您的DetailsView控件也要被另外一个UpdatePanel包含。

  回复  引用  查看    
#25楼  2006-04-17 21:17 | 刀 [未注册用户]
我有事先下了,明天见
  回复  引用    
#26楼  2006-04-18 10:06 | 思考中{OO}      
@Dflying Chen

正如你所说的,我用了两个UpdatePanel确实有点多此一举了,不过经过多方的测试,发现问题并不是出现在这里,代码实现上几乎不算有什么错误,而是数据源的问题,同样的程序我用了其它表做数据源就不会有问题,但我也试通过ObjectDataSource控件来加载存储过程,再绑定到GridView上,当我把ObjectDataSource放在UpdatePanel外面时,GridView并不能访问到ObjectDataSource,只有当我把它移到UpdatePanel里面才行,而且事件也可以正确地触发了,不再有那个恼人的脚本错误.但我现在是做的应用数据源变动比较灵活,如果能在后台代码绑定当然是最方便不过的,请问有解决的办法吗?

  回复  引用  查看    
#27楼 [楼主] 2006-04-18 10:22 | Dflying Chen      
@思考中{OO}
"用了其它表做数据源就不会有问题"
是不是这个表中有什么非法的字符,Atlas没有处理好?

  回复  引用  查看    
#28楼  2006-04-18 10:23 | 刀 [未注册用户]
@Dflying Chen
我的DetailsView(gridview)控件是包含在UpdatePanel中的,而textbox没有包含在UpdatePanel中,现在的问题是DetailsView(gridview)控件中的编辑按钮点击后,textbox的值没有刷新

  回复  引用    
#29楼  2006-04-18 10:32 | 刀 [未注册用户]
@思考中{OO}
后台代码绑定是没有问题的
'GridView数据绑定
Protected Sub GridViewBind(ByVal id_table As Integer)
Dim dt As New DataTable
dt = DataAccess.GetDataTableBySearch("select * from PlanInPlanLogView where TableID = " & id_table)
If Not dt Is Nothing AndAlso dt.Rows.Count > 0 Then
ControlsBind.GridViewDataBind("select * from PlanInPlanDetailsView where InPlanMasterId = " & id_table, GridViewDetails)
End Sub
其中DataAccess.GetDataTableBySearch,ControlsBind.GridViewDataBind是我自己写的得到DataTable和GridView数据绑定的通用类

  回复  引用    
#30楼 [楼主] 2006-04-18 11:05 | Dflying Chen      
@刀
“而textbox没有包含在UpdatePanel中”
您应该将其置于UpdatePanel中

  回复  引用  查看    
#31楼  2006-04-18 11:59 | 思考中{OO}      
@刀
谢谢你, 不过我知道后台代码绑定没有问题,因为用了其它数据做过测试,完全可以正常运行,所以这也是我不解的一个地方..

@Dflying Chen
我想应该不是数据类型的问题,因为我刚才也说了,在页面上绑定的话是可以运行正常的,问题似乎变得越来越悬了,我也是越来越茫然了,我再找找其它原因,还有不懂的再过来请教

  回复  引用  查看    
#32楼  2006-04-18 13:06 | 刀 [未注册用户]
@Dflying Chen
把textbox包进另一个UpdatePanel中就好了,谢谢

  回复  引用    
#33楼  2006-04-18 13:25 | proshea      
请教 Dflying,下面代码中的 Btn_Click 事件为什么不会被调用呢(点击 Button 后没有任何反应)?UpdatePanel 的 EnablePartialUpdates 属性也没有找到,我想是不是改成 EnablePartialRendering 了?
 
 1<body>
 2
 3
 4<form runat="server">
 5
 6    <atlas:ScriptManager runat="server" ID="scriptManager" EnablePartialRendering="true" />
 7    
 8    <atlas:UpdatePanel runat="server" ID="updatePanel" Mode="Conditional">
 9    
10        <Triggers>
11            <atlas:ControlEventTrigger ControlID="btn" EventName="Click" />
12        </Triggers>
13        
14        <ContentTemplate>
15            <asp:Button runat="server" ID="btn" OnClick="Btn_Click" Text="确定" />
16        </ContentTemplate>
17
18    </atlas:UpdatePanel>
19    
20    <asp:Label runat="server" ID="lab" />
21    
22</form>
23
24</body>

  回复  引用  查看    
#34楼 [楼主] 2006-04-18 13:29 | Dflying Chen      
@思考中{OO}
@刀
欢迎讨论哦:)

  回复  引用  查看    
#35楼 [楼主] 2006-04-18 13:33 | Dflying Chen      
@proshea
在您的情况下无须书写<Triggers />部分即可引发Btn_Click事件
EnablePartialRendering就是您要的属性,这个是我的笔误,抱歉。

  回复  引用  查看    
#36楼  2006-04-18 13:56 | 刀 [未注册用户]
有一个问题,在数据更新完成后,想要用对话框显示“数据更新成功!”提示,该如何处理
  回复  引用    
#37楼  2006-04-18 14:31 | proshea      
@ Dflying
        即便去掉 <Triggers /> 部分 Btn_Click 也没有得到执行啊。除非 Button 不被包含在 UpdatePanel 中,可这样就无法实现异步的目的了啊。

  回复  引用  查看    
#38楼  2006-04-18 14:32 | proshea      
@ Dflying
Btn_Click 有什么特殊要求没有?

  回复  引用  查看    
#39楼 [楼主] 2006-04-18 14:54 | Dflying Chen      
@proshea
如果Button只是用来当Trigger的,那么可以不包含在UpdatePanel中阿。
或者包含在UpdatePanel中就不用再写在Trigger中了。
二者任选其一就好。

  回复  引用  查看    
#40楼 [楼主] 2006-04-18 14:57 | Dflying Chen      
@刀
似乎没有什么好办法吧

  回复  引用  查看    
#41楼 [楼主] 2006-04-18 14:59 | Dflying Chen      
@proshea
Btn_Click 没有什么特殊要求。

  回复  引用  查看    
#42楼  2006-04-18 15:28 | proshea      
@ Dflying
我太晃了。我在 Btn_Click 中干的事情是设置 Label 的 Text,我把它放到 <ContentTemplate> 中就 OK 了。

  回复  引用  查看    
#43楼 [楼主] 2006-04-18 16:22 | Dflying Chen      
@proshea
呵呵,多小心哦

  回复  引用  查看    
#44楼  2006-04-19 17:00 | 刀 [未注册用户]
@Dflying Chen
使用UpdatePane后,response.write不起作用了,why?

  回复  引用    
#45楼 [楼主] 2006-04-19 17:08 | Dflying Chen      
@刀
在UpdatePanel中不要使用Response.Write();

  回复  引用  查看    
#46楼  2006-04-21 11:43 | 刀 [未注册用户]
@Dflying Chen
我点击按钮执行数据更新,更新完成后用response.write("<script language=javascript>alert('数据更新成功!');</script>")显示提示信息。我把按钮放到UpdatePanel之外,但是对话框依然不出现。是不是只要使用了UpdatePanel,那么代码中所有的response.write都失效?
ajax使用的js库,连警告框都不能处理,很奇怪!

  回复  引用    
#47楼 [楼主] 2006-04-21 11:58 | Dflying Chen      
@刀
只要按钮引发的是Partially Update,就不能使用response.write

  回复  引用  查看    
#48楼  2006-04-21 12:09 | 刀 [未注册用户]
@Dflying Chen
我使用的lable1.text="<script language=javascript>alert('数据更新成功!');</script>",对话框也不出现

  回复  引用    
#49楼 [楼主] 2006-04-21 13:05 | Dflying Chen      
@刀
Scripts appended to DOM on the flight will not be exceuted.

  回复  引用  查看    
#50楼  2006-05-09 17:38 | EricHuang [未注册用户]
那在atlas下怎样弹出提示框的效果呢??
  回复  引用    
#51楼  2006-05-12 16:36 | dlwang2002 [未注册用户]
知道怎么才能在updatePanel运行结束后执行一个js脚本么?
比方说:up.Update();JS.Invoke();

  回复  引用    
#52楼 [楼主] 2006-05-12 16:40 | Dflying Chen      
@EricHuang
可以直接用alert()啊

  回复  引用  查看    
#53楼 [楼主] 2006-05-12 16:41 | Dflying Chen      
@dlwang2002
您可以尝试一下将对JS的调用在Update中写入页面中的某个控件内。

  回复  引用  查看    
#55楼 [楼主] 2006-05-14 17:17 | Dflying Chen      
@oamvp
that's cool! thanks!

  回复  引用  查看    
#56楼  2006-06-01 18:37 | crazydd [未注册用户]
Dflying大大: 请教你个问题: updatepanel可以嵌套使用嘛?
  回复  引用    
#57楼 [楼主] 2006-06-01 18:53 | Dflying Chen      
@crazydd
不知道,试试看吧

  回复  引用  查看    
#58楼  2006-07-09 16:11 | cipchk      
打扰了
您上面所说的:“在UpdateProgress的Template中有一个magic ID:abortButton”我不知道该怎么实现它,我怎么也找不到相关的这个属性呢?谢谢

  回复  引用  查看    
#59楼  2006-07-10 12:01 | shalala      
@cipchk

直接写id="abort"就可以了吧?

  回复  引用  查看    
#60楼  2006-07-10 14:38 | cipchk      
@shalala
没有ID这个属性
更确切的说Template没有任何一个属性

  回复  引用  查看    
#61楼 [楼主] 2006-07-21 18:23 | Dflying Chen      
@cipchk
@shalala
书写类似下面的代码:
<button id="abortButton" type="button" runat="server">Abort </button>

  回复  引用  查看    
#62楼  2006-08-08 16:24 | xu [未注册用户]
为什么我用window.open打开一个窗口,然后在页面使用updatepanel就会出现Unknown error
我用的最新的7月份版,以前的版本并没有这个错误啊,是不是新版本的问题?
谢谢

  回复  引用    
#63楼 [楼主] 2006-08-08 19:28 | Dflying Chen      
@xu
能给出一小段代码么?演示一下。

  回复  引用  查看    
#64楼  2006-08-09 17:38 | tom      
@Dflying
关于这句: 在UpdatePanel中不要使用Response.Write(); 。这会扰乱UpdatePanel的执行过程。
能不能详细解释一下? 我觉得是Write出来的东西破坏了DOM的结构 因为你write空格或是\r\n都没有问题

  回复  引用  查看    
#65楼 [楼主] 2006-08-11 17:05 | Dflying Chen      
@tom
这是Atlas Forums上好多人的问题,因为我没有使用过,所以也没有仔细分析过。但我觉得对于一个良好设计的ASP.NET应用程序,Response.Write()真的没有什么存在的必要。

  回复  引用  查看    
#66楼  2006-09-15 17:36 | 风云 [匿名] [未注册用户]
请问是不是在控件中不能用UpdatePanel啊?

我建立了了个.aspx,里面放了个PlaceHolder。然后根据参数调入控件。我在.ascx中用UpdatePanel却引发
The UpdatePanel 'UpdatePanel1' was not present when the page's InitComplete event was raised. This is usually caused when an UpdatePanel is placed inside a template.

错误。

请问这个能不能解决?

  回复  引用    
#67楼 [楼主] 2006-09-15 17:52 | Dflying Chen      
@风云 [匿名]
更新至最新版本的Atlas即可。

  回复  引用  查看    
#68楼  2006-09-21 12:32 | happydai      
我在UpdatePanel外面放置了一个DropDownList,在里面放置了一个GridView,希望用DropDownList的值动态控制GridView的表的选择.
建立相应Trigger后,在DropDownList_SelectedIndexChanged中
写如下C#代码:
DataView detail= new DataView(DataSet.Tables[DropDownList1.SelectedValue]);
GridView1.DataSource=detail;
GridView1.DataBind();

测试发现,如果DropDownList1是设计时定义的,则能够正常调用表;如果DropDownList1是运行时在Page_Load中通过DataBind建立的,则总是将DropDownList1中的第一个表取出。跟踪发现SelectedValue这个时候总等于0。
这是为什么?如何解决?

  回复  引用  查看    
#69楼  2006-09-21 12:53 | happydai      
明白了,是IsPostBack问题。THANX ANYWAY
  回复  引用  查看    
#70楼 [楼主] 2006-09-21 19:45 | Dflying Chen      
@happydai
不好意思没有及时回复……既然解决了就好!感谢你将解决方案发布出来,与我们分享!

  回复  引用  查看    
#71楼  2006-10-10 11:48 | Happy John [未注册用户]
在repeater里,有linkbutton为LinkEmail

在updatepanel里面,有一个PANEL,

<Triggers>
<atlas:ControlEventTrigger ControlID="LinkEmail" EventName="Click" />
</Triggers>

为何出现The ControlID property of the trigger must reference a valid control.
应该如何捆绑此控件!

  回复  引用    
#72楼  2006-10-13 18:31 | 名如烟 [未注册用户]
想请问各位大哥大,大姐大,在UpdatePanle中怎么用FileUpload来做图片文件上传
  回复  引用    
#73楼 [楼主] 2006-10-14 01:48 | Dflying Chen      
@Happy John
repeater中的控件和页面不在一个INamingContainer中,所以会出现这种问题。
对于这种情况,您何不将repeater也用UpdatePanel包围起来呢?

  回复  引用  查看    
#74楼 [楼主] 2006-10-14 01:51 | Dflying Chen      
@名如烟
这个似乎不太可能,这是由XMLHttpRequest对象和HTTP协议本身所决定的。一个可用的办法是在UpdatePanel中包包含一个IFrame,在其中进行文件上传工作。

  回复  引用  查看    
#75楼  2006-10-14 22:23 | catxp511 [未注册用户]
我想问一下,UpdatePanel在响应事件时能做出有等待动画的效果吗。一般axaj都有这个效果,就是提交的时候显示个动画gif文件或div,结束时这个gif或div隐藏,如果能做到这样就好了。

另我发现似乎"sys未定义"或"}"的错误似乎跟某种病毒有关,这种病毒会感染系统上的所有exe文件,也会通过局域网传播,即便你重装新的系统依然被其它盘的exe文件感染回来。现在这种问题还在困挠着我。烦啊。。。

  回复  引用    
#76楼 [楼主] 2006-10-14 22:45 | Dflying Chen      
@catxp511
当然,你可以使用UpdateProgress或者UpdatePanelAnimation控件实现。

sys未定义似乎是因为服务器端操作系统未安装必要的最新补丁造成的。

  回复  引用  查看    
#77楼  2006-10-21 22:32 | belive [未注册用户]
如何让UpdateProgress的进度条在指定位置显示!比如在浮动层中!
  回复  引用    
#78楼 [楼主] 2006-10-24 08:56 | Dflying Chen      
@belive
您可以先创建一个浮动层,然后将UpdateProgress的声明放在其中即可。

  回复  引用  查看    
#79楼  2006-10-24 15:23 | zhou_heb [未注册用户]
使用UpdatePanel时不能使用Response.Write()
有人说使用ClientScript.RegisterStartupScript()方法可以弹出对话框
但我使用了
ClientScript.RegisterStartupScript(this.GetType), "ButtonClickScript", "alert('1')", true);
仍然弹不出对话框
请问各位是怎么回事?

  回复  引用    
#80楼 [楼主] 2006-10-24 19:07 | Dflying Chen      
@zhou_heb
你试试看最新的版本?

  回复  引用  查看    
#81楼  2006-10-24 20:52 | zhou_heb [未注册用户]
@Dflying Chen
我现在用的就是新的版本
但是仍然不能弹出对话框
好像旧版本的能弹出对话框

  回复  引用    
#82楼 [楼主] 2006-10-25 09:02 | Dflying Chen      
@zhou_heb
根据我的经验,使用ClientScript.RegisterStartupScript()是没有任何问题的,你遇到什么错误提示了么?

  回复  引用  查看    
#83楼  2006-10-25 09:41 | zhou_heb [未注册用户]
@Dflying Chen
在使用ClientScript.RegisterStartupScript()过程中没有出现任何错误提示
后来在ajax.asp.net的论坛上看到一帖
其中提到在现在的版本中使用如下方法可以弹出提示框
ScriptManager.registerXXX( controlPlacedInsideUpdatePanel, controlPlacedInsideUpdatePanel.GetType(), "key", script block, true );
而且在我的程序中也已经成功弹出提示框,
只是不明白controlPlacedInsideUpdatePanel是不是随便一个在UpdatePanel中的一个控件就可以?
帖子地址:http://forums.asp.net/thread/1438086.aspx

  回复  引用    
#84楼 [楼主] 2006-10-25 10:01 | Dflying Chen      
@zhou_heb
应该是的吧,谢谢您提供的方案!!

  回复  引用  查看    
#85楼  2006-10-25 21:01 | zhou_heb [未注册用户]
@Dflying Chen
在使用UpdatePanel又碰到这个样一问题
在添加数据的时候使用了验证组件RegularExpressionValidator来判断用户输入的数据是否符合一定的规则
最后且ValidationSummary把错误信息用提示框的形式出来
但是现在显示不出来了
是不是在UpdatePanel内也不能使用ValidationSummary弹出提示框呀?
如果使用RegularExpressionValidator倒是可以一个一个的显示出错误来

  回复  引用    
#86楼 [楼主] 2006-10-26 02:07 | Dflying Chen      
@zhou_heb
尝试过最新的ASP.NET AJAX中带的那些Validator了么?

  回复  引用  查看    
#87楼  2006-10-26 08:02 | zhou_heb [未注册用户]
@Dflying Chen
还未尝试
因为程序是以前的
验证组件也是以前加入的
试试吧

  回复  引用    
#88楼 [楼主] 2006-10-26 09:05 | Dflying Chen      
@zhou_heb
这样就应该好了!

  回复  引用  查看    
#89楼  2006-11-29 14:56 | 饭桶 [未注册用户]
gridview 全部在updatepanel中,
gridview设了可以选择.但是,在选择时出现错误.gridview自带的_dopostback(....)找不到对像!!哪个能帮忙解决一下呀.

  回复  引用    
#90楼 [楼主] 2006-11-29 21:24 | Dflying Chen      
@饭桶
将Form的PostBackURL(大概如此,记不住了)设置为自身。

  回复  引用  查看    
#91楼 [楼主] 2006-11-29 21:24 | Dflying Chen      
@zhou_heb
应用了这些新的验证组件,应该就好了吧

  回复  引用  查看    
#92楼  2006-12-02 14:18 | ice[匿名] [未注册用户]
@Dflying Chen
不知道@zhou_chen里所说的ScriptManager.registerXXX( controlPlacedInsideUpdatePanel, controlPlacedInsideUpdatePanel.GetType(), "key", script block, true );
是什么意思,我看不到明白/?

  回复  引用    
#93楼 [楼主] 2006-12-02 15:02 | Dflying Chen      
@ice[匿名]
这是注册脚本的写法阿

  回复  引用  查看    
#94楼  2006-12-18 14:13 | 天歆      
我发现使用UpdatePanel后在textBox中使用中文会出现乱码,好像不认中文,这是怎么回事?有什么解决的办法没有?
  回复  引用  查看    
#95楼  2006-12-18 14:48 | 天歆      
我尝试在TextBox.Text值中写入中文字符,然而返回服务器的TextBox.Text值则成为各种乱码,而且字符数比写入的要多。请问是否UpdatePanel没有对中文字符做处理。如何处理才能解决问题呢?
  回复  引用  查看    
#96楼  2006-12-18 16:55 | 天歆      
我在“http://www.cnblogs.com/wuxilin/archive/2006/11/22/569172.html”找到了解决问题的办法,我选择了对提交字符串编码。不过,如果你有更好的解决方案,请通知我好吗?Thanks :)
  回复  引用  查看    
#97楼 [楼主] 2006-12-19 23:39 | Dflying Chen      
@天歆
一般来讲,用utf-8编码就够了,我比较喜欢这个,呵呵

  回复  引用  查看    
#98楼  2006-12-23 09:06 | 天歆      
谢谢,不过我的程序是在原Asp建的网站中部分使用ASp.net编程的。要从ASP中转换中文的Session。当时弄得比较麻烦,现在也不敢随便改动配置文件中的编码了。只好在需要的地方单独对提交的字符串进行编码传递。
对了,不能在updatePanel中使用Response.Write(),那我要在Button_Click事件中使用
Response.Write("<script>window.open('test.aspx?text=test1&group="+group.ToString()+")</script>")另外弹出一个新的窗口怎么办呢?

  回复  引用  查看    
#99楼  2006-12-23 09:23 | 天歆      
请问ClientScript.RegisterStartupScript(Type type,String key,String script,bool addScriptTags)中的几个参数是什么意思?除了第三个参数外,第一个type,第二个key应该写什么内容才有效的执行脚本呢?
  回复  引用  查看    
#100楼  2006-12-23 11:01 | 天歆      
可以使用了, 用ClientScript.RegisterStartupScript()就可以写弹出新窗口的脚本。
不能执行脚本的原因原来只是我自己写错脚本方法名称而已。呵呵,自己真是大头。

  回复  引用  查看    
#101楼 [楼主] 2006-12-23 11:40 | Dflying Chen      
@天歆
:)解决问题就好,欢迎你常来坐坐:)

  回复  引用  查看    
#102楼  2007-01-05 10:28 | freedom[匿名] [未注册用户]
请问可以通过后台方法直接出发UpdatePanel吗?
比如我有一个js前台生成的元素,鼠标点击该元素后触发UpdatePanel

  回复  引用    
#103楼 [楼主] 2007-01-29 11:17 | Dflying Chen      
@freedom[匿名]
当然可以了,不过实现起来略微有点技巧……

  回复  引用  查看    
#105楼  2007-04-17 12:16 |       
终于试通了。
1. 在Asp.Net项目中引用System.Web。
2. 弃用Page.RegXXX(...),改用System.Web.UI.ScriptManager.RegisterStartupScript(Page page, Type type, string key, string script, bool addScriptTags)。

搞定。

  回复  引用  查看    
#106楼 [楼主] 2007-04-17 16:45 | Dflying Chen      
@代
:)

  回复  引用  查看    
#107楼  2007-05-07 19:36 | hehe [未注册用户]
显然Gmail不会使用UpdateProgress控件,呵呵。
微软再次使得搞全微软技术开发的程序员贬值!
关键是你要清楚控件的背后是如何实现的,但显然很多使用ajax.net控件很熟的控件熟手,不是很明白。

  回复  引用    
#108楼 [楼主] 2007-05-07 19:59 | Dflying Chen      
@hehe
呵呵,你说得对,但使用是理解的前提阿

  回复  引用  查看    
#109楼  2007-05-15 12:01 | flyxuan [未注册用户]
dear sir ,
現在遇到了一個很棘手的問題,按照你給出的
务必设定ScriptManager的EnablePartialRendering属性为true
我已經改了屬性,但是還是不能按照Ajax的方式執行,代碼如下︰
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" EnablePartialRendering="true" runat="server" >
</asp:ScriptManager>
&nbsp;
<asp:UpdatePanel ID="UpdatePanel1" runat="server" RenderMode="Block" UpdateMode="Always">
<ContentTemplate>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
</ContentTemplate>

</asp:UpdatePanel>
&nbsp;
</form>


protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = "test1";
}

期盼您的答覆,謝謝~

  回复  引用    
#110楼 [楼主] 2007-05-15 17:09 | Dflying Chen      
@flyxuan
客户端有就JavaScript异常么?用HTTP嗅探器看看阿,怀疑是你的ASP.NET AJAX配置问题

  回复  引用  查看    
#111楼  2007-07-31 00:07 | 壁虎      
这个帖子历史悠久啊。从去年到今年都有人在讨论。
  回复  引用  查看    
#112楼 [楼主] 2007-07-31 08:43 | Dflying Chen      
@壁虎
是啊

  回复  引用  查看    
#113楼  2007-07-31 23:21 | eagle [未注册用户]
在updatepanel 中使用了gridview
我使用gridview来编辑数据,点编辑后输入值后点更新无任何动作?跟踪也未执行进去,取消功能可以?
加入到updatepanel的tiggers 中也不行?

  回复  引用    
#114楼  2007-07-31 23:28 | eagle [未注册用户]
直接报这错!
A control with ID 'GridView1' could not be found for the trigger in UpdatePanel 'UpdatePanel1'.

  回复  引用    
#115楼 [楼主] 2007-08-02 11:58 | Dflying Chen      
@eagle
GridView的ID写对了么?

  回复  引用  查看    
#116楼  2007-08-09 15:18 | sharetop [未注册用户]
A control with ID 'GridView1' could not be found for the trigger in UpdatePanel 'UpdatePanel1'.

我也遇到这个问题了,不过不是GridView而是Button,也说找不到.ID肯定没写错.
就是放在AccordionPane里就不行了.代码如下:

<cc1:AccordionPane ID="AccordionPane1" runat="server" >
<Header>
<asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:LinkButton ID="btn1" runat="server" Text="2008" OnClick="LinkButton2_Click">2008</asp:LinkButton>
</ContentTemplate>
</asp:UpdatePanel>
</Header>
<Content>
<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:GridView ID="GridView2" runat="server">
<Columns>
<asp:BoundField DataField="Name" />
<asp:BoundField DataField="Age" />
</Columns>
</asp:GridView>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btn1" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</Content>
</cc1:AccordionPane>

  回复  引用    
#117楼 [楼主] 2007-08-23 19:01 | Dflying Chen      
@sharetop
把<asp:UpdatePanel>放在<ContentTemplate>里面

  回复  引用  查看    
#118楼  2007-09-10 10:45 | 飞翔在平流层 [未注册用户]
第一次看到这个帖子

一口气看完 再对着做了编

收获不小

感谢楼主和各位的提问和回答

  回复  引用    
#119楼  2007-09-12 15:44 | 聂锋      
根据文章,做完了第一个例子,,非常感谢你,后续的文章继续看。
  回复  引用  查看    
#120楼  2008-03-21 00:36 | junhnist [未注册用户]
楼主你好,我碰到个问题,还望赐教:
我想在<Triggers>
<cc1:ControlEventTrigger ControlID="Button2" EventName="Click" />
</Triggers>
中指定个BUTTON的点击事件,如果这个按钮放在datalist的<ItemTemplate>中,应该如何写呢?盼复!

  回复  引用    
#121楼  2008-03-23 15:50 | lanbo [未注册用户]
楼主好:
我在用UpdatePanel时,在它里面的文本框中输入<N><a>任何这样HTML标签的,页面就报错,不知道是什么原因?请指点
错误提示是:
Sys.WebForms.PageRequestManagerServerErrorException:An unknown error occured while procesing the request on the server.The status code returned from the server was:500

期待您 的回信

  回复  引用    
#122楼  2008-07-17 16:02 | scywyf [未注册用户]
在我的頁面裡,分為了兩個區,一個查詢區,一個編輯區,這兩個區分別放在不同的updatepanel裡 .在編輯區裡,有個按鈕開始是隱藏的,當點編輯區裡的一個按鈕時,這個隱藏的按鈕要出現,而且查詢區要隱藏 .但是當我把查詢區的updatepanel拿掉後,當去點編輯區的那個按鈕,使隱藏的按鈕出現後,我再去點這個隱藏的按鈕時,頁面報錯 ,錯誤信息為;;回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true" %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
.我想是不是因為那個按鈕在一開始是隱藏的,所以去看原始碼時是看不到這個控件的id後,所以在客戶端也找不到這個控件,這時去點它就會報錯了?但是具體的原理到底是什麼呢?





  回复  引用    
#123楼  2008-07-23 23:03 | yisongqing [未注册用户]

那我如果是Lable呢?
而且我的Lable没有事件。
那怎么用Triggers这个属性来设置呀。
(我的页面布局不允许我直接把Lable放入UpdatePanel中)

请各位高手们指教一下啦!
就是说我总不能这样写吧,如:
<asp:AsyncPostBackTrigger ControlID="lblloginname" EventName=“”/>

  回复  引用    

发表评论



姓名 [登录] [注册] 
主页
Email (仅博主可见) 
验证码 *  验证码看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论   新用户注册   返回页首      

导航: 网站首页 社区 新闻 博问 闪存 网摘 招聘 .NET频道 知识库 找找看 Google站内搜索



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
China-Pub 计算机绝版图书按需印刷服务

相关文章:

相关链接: