首页 > 编程 > .NET > 正文

注册起动脚本,ASP.NET AJAX的一项重要功能

2024-07-10 13:09:14
字体:
来源:转载
供稿:网友

   最近的项目中一直在使用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>
                    &nbsp;</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!希望有高人指点一下:)。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表