客户端脚本触发button服务器端Click事件并促使UpdatePanel局部刷新!

拼命三朗 2009-03-27 11:15:33
举例:
一个Button控件在UpdatePanel之外但被UpdatePanel截获进行局部刷新,
而由用户使用鼠标单击提交的Button1_Click事件对UpdatePanel中的内容所做的修改可以更新到客户端。
但是在客户端使用

__doPostBack('Button1','');

提交到服务器端的Button1_Click事件内对UpdatePanel中的内容所做的修改没有更新到客户端。

如何做到使用代码提交页面触发Button1_Click事件并使UpdatePanel局部刷新?
...全文
3517 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
妙指 2009-09-02
  • 打赏
  • 举报
回复
他们说复杂了,你只要把UpdatePanel内的控件的EnableViewState设为false就可以了.不能更新客户端,就是这个缓存惹的祸.
拼命三朗 2009-03-31
  • 打赏
  • 举报
回复
我的示例代码
Default3.aspx:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default3.aspx.vb" Inherits="Default3" %>

<%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
Namespace="System.Web.UI" TagPrefix="asp" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
<script language="javascript">
function open()
{
if(window.showModalDialog('Default4.aspx')=='1')
{
__doPostBack('Button1','');
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
 <asp:Button ID="Button1" runat="server" Text="Button" /> 
<asp:Button ID="Button2" runat="server" Text="Button" />
    
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:TextBox ID="Ret" runat="server"></asp:TextBox>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
 
<asp:Button ID="Button3" runat="server" Text="Button" /></div>
</form>
</body>
</html>

Partial Class Default3
Inherits System.Web.UI.Page

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
If Session("ret") = "" Then
System.Web.UI.ScriptManager.RegisterStartupScript(Me.Page, Me.Page.GetType, "", "<script language='javascript'>open()</script>", False)
Else
Me.Ret.Text = Session("ret")
Session("ret") = Nothing
End If
End Sub
End Class

Default4.aspx:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default4.aspx.vb" Inherits="Default4" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<base target="_self" />
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="return" /></div>
</form>
</body>
</html>

Partial Class Default4
Inherits System.Web.UI.Page

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Session("ret") = "1"
Me.Response.Write("<script language='javascript'>window.returnValue='1';window.close();</script>")
End Sub
End Class


namhyuk 2009-03-27
  • 打赏
  • 举报
回复
对了,showModalDialog打开的aspx页面如果有Postback操作,会引起问题的.你没碰到过吗? 好像有解决办法的.
namhyuk 2009-03-27
  • 打赏
  • 举报
回复
prm._doPostBack(' <%= Button1.ClientID %>', '');
像这样,可能你的这个Button1要么在UpdatePanel里,要么设成UpdatePanel的Trigger对象之一.
namhyuk 2009-03-27
  • 打赏
  • 举报
回复
唉,你。。。
function open()
{
if(window.showModalDialog('Default4.aspx')=='1')
{

var prm = Sys.WebForms.PageRequestManager.getInstance();
prm._doPostBack(' <%= Button1.ClientID %>', '');


}
}

用ClientID是考虑你的页面如果是嵌入在MasterPage内的情况,加ClientID是个好习惯.
拼命三朗 2009-03-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hecong875 的回复:]
引用楼主 lujianjiang 的帖子:
举例:
一个Button控件在UpdatePanel之外但被UpdatePanel截获进行局部刷新,
而由用户使用鼠标单击提交的Button1_Click事件对UpdatePanel中的内容所做的修改可以更新到客户端。
但是在客户端使用

__doPostBack('Button1','');

提交到服务器端的Button1_Click事件内对UpdatePanel中的内容所做的修改没有更新到客户端。

如何做到使用代码提交页面触发Button1_Click事件并使Update…
[/Quote]
第二次的Button1_Click事件中使用UpdatePanel1.Update(),没有作用
拼命三朗 2009-03-27
  • 打赏
  • 举报
回复
我要实现的是:

用户首先单击button,在button_click事件内利用
System.Web.UI.ScriptManager.RegisterStartupScript(Me.Page, Me.Page.GetType, "", "<script language='javascript'>open()</script>", False)
打开一个模式IE对话框,模式对话框返回后再次提交页面并触发服务器端的Button_Clic事件并修改UpdatePanel内的对象


open函数如下:
function open()
{
if(window.showModalDialog('Default4.aspx')=='1')
{
__doPostBack('Button1','');
}
}

利用局部刷新的效果可以与CS程序相同
namhyuk 2009-03-27
  • 打赏
  • 举报
回复
对了,我的回复都不算吧。我其实光看你的标题,没看你的要求。呵呵。forget it.
hecong875 2009-03-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 lujianjiang 的帖子:]
举例:
一个Button控件在UpdatePanel之外但被UpdatePanel截获进行局部刷新,
而由用户使用鼠标单击提交的Button1_Click事件对UpdatePanel中的内容所做的修改可以更新到客户端。
但是在客户端使用

__doPostBack('Button1','');

提交到服务器端的Button1_Click事件内对UpdatePanel中的内容所做的修改没有更新到客户端。

如何做到使用代码提交页面触发Button1_Click事件并使UpdatePanel局部刷新?
[/Quote]

你都执行'Button1' 的后台方法了! 那你直接 在'Button1' 后台里面 updatepanel.update();
不就行了吗?
namhyuk 2009-03-27
  • 打赏
  • 举报
回复
我不知道你这个Button1_Click里的东西做什么的,不过也许我会把Button1_Click里的内容做成服务器端static方法,然后通过js调用执行。。。

这方面你看一下用js执行服务器端方法和js访问WebService的相关内容吧。
namhyuk 2009-03-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lujianjiang 的回复:]
但是这样好像没有触发服务器端的Button_Click过程啊
[/Quote]

js方法里return false;了当然不触发了。

我还以为你要那种纯客户端刷新UpdatePanel的效果呢。
拼命三朗 2009-03-27
  • 打赏
  • 举报
回复
但是这样好像没有触发服务器端的Button_Click过程啊
koukoujiayi 2009-03-27
  • 打赏
  • 举报
回复
UpdatePanel的UpdateMode设置为Conditional,
在Button1的Click下执行:
UpdatePanel1.Update();
namhyuk 2009-03-27
  • 打赏
  • 举报
回复
<asp:Button放在UpdatePanel内也可以,放在外面也可以,不用设置UpdatePanel的trigger为Button1
namhyuk 2009-03-27
  • 打赏
  • 举报
回复
1、UpdatePanel内的GridView的EnableViewState设为false;
2、
<head runat="server">
<title></title>
<script type="text/javascript">
function refreshUpdatePanel() {
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm._doPostBack('<%= UpdatePanel1.ClientID %>', '');
return false;
}
</script>
</head>

3、
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:GridView ID="GridView1" runat="server"
...
<asp:Button ID="Button1" runat="server" Text="Button" onclientclick="return refreshUpdatePanel();" />

4、OK!
拼命三朗 2009-03-27
  • 打赏
  • 举报
回复
使用
Sys.WebForms.RequestManager.getInstance().Update('UpdatePanel1', null);
Microsoft JScript 运行时错误: 'Sys.WebForms.RequestManager' 为空或不是对象

使用
Sys.WebForms.PageRequestManager.getInstance().Update('UpdatePanel1',null);
Microsoft JScript 运行时错误: 对象不支持此属性或方法
namhyuk 2009-03-27
  • 打赏
  • 举报
回复
<asp:Button ... OnClientClick="jsFunc()"...

function jsFunc()
{
Sys.WebForms.RequestManager.getInstance().Update('<%= UpdatePanel1.ClientID %>'), null);
...
}
? 没试过,等一会我试一下。
拼命三朗 2009-03-27
  • 打赏
  • 举报
回复
我在考虑,通过用户单击button的提交页面的代码和方式是怎么样的,为什么可以触发button_click,也可以局部刷新,是不是在提交前要额外处理一些事情,也就是说UpdatePanel是如何截获button的单击的
拼命三朗 2009-03-27
  • 打赏
  • 举报
回复
prm._doPostBack(' <%= Button1.ClientID %>', '');
这样也不行,是整个页面刷新,也没触发button_click事件
拼命三朗 2009-03-27
  • 打赏
  • 举报
回复
我的button1在外面,是UpdatePanel的Trigger对象之一

52,798

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ajax
社区管理员
  • Ajax
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧