最近的项目中一直在使用atlas july ctp,自从atlas正式更名后,连续推出了beta和beta2两个版本,但是我一直在观望,原因就是beta版本不稳定而且升级太麻烦了。一日偶然看到了杨丹的这篇随笔,突然发现原来scriptmanager可以注册在客户端部分刷新的updatepanel中注册启动后执行的javascript!这可是困扰了我很长时间的一个问题!这样不但可以在使用updatepanel的情况下使用javascript弹出对话框,也可以在开发使用javascript脚本的服务器控件的时候,使控件的起动脚本得以执行,这样原来的和updatepanel不兼容的控件可以很容易的改为ajax enabled^_^。
不过,令人不解的是不知道处于什么考虑,registerstartupscript函数竟然实现为了类的静态函数,可是没有scriptmanager的updatepanel更本不能执行啊,这样还需要多打几个字!另外,需要注意的是第一个参数是updatepanel的实例,如果在页面中有多个updatepanel,如果每个updatepanel的updatemode都是“always”[默认值]的话,那么你使用那个updatepanel的实例作为参数都可以;如果每个updaepanel的updatemode=conditional,那么你必须使用正在更新的那个updatepanel作为参数,这样脚本才能起作用。下面是我作的一个简单的示例:
页面标记
<%@ page language="c#" autoeventwireup="true" codefile="default.aspx.cs" inherits="_default" %>
<!doctype html public "-//w3c//dtd xhtml 1.1//en" "http://www.w3.org/tr/xhtml11/dtd/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>untitled page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:scriptmanager id="scriptmanager1" enablepartialrendering="true" runat="server">
</asp:scriptmanager>
<br />
<asp:updatepanel id="updatepanel1" updatemode="conditional" runat="server"><contenttemplate>
<asp:textbox id="textbox1" runat="server" ></asp:textbox> <asp:linkbutton id="linkbutton1" runat="server" onclick="linkbutton1_click">linkbutton</asp:linkbutton>
</contenttemplate>
<triggers>
<asp:asyncpostbacktrigger controlid="linkbutton1" />
</triggers>
</asp:updatepanel>
<asp:updatepanel id="updatepanel2" rendermode="block" updatemode="always" runat="server">
<contenttemplate>
<asp:textbox id="textbox2" runat="server"></asp:textbox>
<asp:linkbutton id="linkbutton2" runat="server" onclick="linkbutton2_click">linkbutton</asp:linkbutton>
</contenttemplate>
</asp:updatepanel>
<br />
<div>
<br />
<asp:updateprogress id="updateprogress1" runat="server"><progresstemplate>
please waiting, retrieving data from server
</progresstemplate>
</asp:updateprogress>
</div>
</form>
</body>
</html>
代码
using system;
using system.data;
using system.configuration;
using system.web;
using system.web.security;
using system.web.ui;
using system.web.ui.webcontrols;
using system.web.ui.webcontrols.webparts;
using system.web.ui.htmlcontrols;
public partial class _default : system.web.ui.page
{
protected void page_load(object sender, eventargs e)
{
}
protected void linkbutton1_click(object sender, eventargs e)
{
system.threading.thread.sleep(1000);
textbox1.text = datetime.now.tolongtimestring();
textbox2.text = textbox1.text;
string js = "alert('ok button1 clicked!')";
microsoft.web.ui.scriptmanager.registerstartupscript(updatepanel2, this.gettype(), "btn1clicked", js, true);
}
protected void linkbutton2_click(object sender, eventargs e)
{
system.threading.thread.sleep(900);
textbox2.text = datetime.now.tolongtimestring();
textbox1.text = textbox2.text;
string js = "alert('ok button 2 clicked!')";
microsoft.web.ui.scriptmanager.registerstartupscript(updatepanel2, this.gettype(), "btn2clicked", js, true);
}
} btw,我在使用时发现一个问题,不知道是个bug还是我使用不当,我在调试中发现updatepanel.isinpartialrendering的值始终是false!希望有高人指点一下:)。
新闻热点
疑难解答
图片精选