UpdatePanel触发javascript脚本的方法附代码_应用技巧

一.预呈现数据无法更改

  1.大家知道,预呈现的数据是无法更改的,以前可能提到过,这里再看demo,自定义一个控件

[DefaultProperty("Text")]
[ToolboxData("<{0}:JsControl runat=server></{0}:JsControl>")]
public class JsControl : WebControl
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
 public string Text
 {
 get
 {
 String s = (String)ViewState["Text"]; 
 return ((s == null) ? String.Empty : s); 
 }

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

 protected override void OnPreRender(EventArgs e)
 {
 Text = "hello,you can't change me"; 
 base.OnPreRender(e); 
 }

 protected override void RenderContents(HtmlTextWriter output)
 {
 output.Write(Text); 
 }
}
aspx页面

protected void Button1_Click(object sender, EventArgs e)
{
JsControl1.Text = "I want to change the Text property"; 
}
  你会发现你并未更改属性.这牵涉到控件生命周期的执行.为什么要说这个,因为控件的大部分脚本都是在预呈现中注册的. 

  这有什么问题吗? 其本身想法很好,脚本在此事件(指OnPreRender)中注册,注册脚本资源在前(控件夹中间),脚本初始化在最后.这符合javascript的使用原则,先导入脚本,然后有标签,初始化的脚本须放在标签后面.

  二.UpdatePanel引起的问题

  上面的问题如果是服务器提交回传的则可行,主要问题是我们要用ajax无刷新注册脚本.以下我们再来看asp.net2.0内置的treeview控件,拖个控件要页面看其生成的html代码。

  你已经看到很多的脚本注册和初始化了.

  我们来测试下UpdatePanel能干什么事情,我们设置其属性Visible为False到True

  借助FireBug的威力我们来看下UpdatePanel在无刷新状态下返回给了我们什么
 
  出错了,大家可能也遇到过此情况,很正常嘛,UpdatePanel没有为我们注册脚本也没未我们初始化,在属于正常现象,UpdatePanel只管其容器里面的,其他的不归它管.

  三.解决方法

  要解决TreeView控件,我是想不出来,这个控件算是在asp.net ajax模式下算是完蛋了.为了迎合asp.net ajax框架的运用,我们需要知道UpdatePanel无刷新更新范围,当我们自己定义控件的时候就需要注意.

1.控件本身标签
2.控件内部
3.UpdatePanel容器内部

  若想使用UpdatePanel更新数据后再触发客户端事件的,有以下方案

  1.通过更改现有控件属性,如

Button1.Attributes["onmouseover"] = "alert('hello')"; 
  2.在呈现过程中脚本初始化

  第一种方法简单运用还可以,复杂就不行了,我们还是需要把脚本封装好跟控件结合使用的,我们不再在预呈现中注册脚本,而在呈现中实现(即RederContent方法).
我们只要保证脚本资源在前,初始化在后,控件在中间这一原则就可以了...以下方法是可行的

如下
protected override void RenderContents(HtmlTextWriter output)
{
output.Write("<script src=\"xxxx.js\"></script>"); 
output.Write(Text); 
output.Write("<script>alert('hello')</script>"); 
}
  四.几个误区

  1.验证控件在ajax框架中可以完好使用
其实是其加载了一段脚本,不然其也会挂掉
  2.状态保留
  在UpdatePanel中更新数据后,再Postback,无刷新更新的数据状态还保留
  3.更新数据后执行客户端脚本

曾经我们天真的会这么写

protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = "alert('hello')"; 
}
  结果什么也没发生,window.onload事件已过,除非你刷新(可你不想刷新),不然没人帮你触发。
  谁来触发?微软帮我们准备好了。你要的大概就是这个了,数据更新前后都是一个事件触发。我们可以围绕着这两个事件为控件做点事情。这个状态适合于数据取到后就立马触发的需要。
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler); 
 Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler); 
 function BeginRequestHandler(sender, args)
 {
 var elem = args.get_postBackElement(); 
 ActivateAlertDiv('visible', 'AlertDiv', elem.value + ' processing'); 
 }
 function EndRequestHandler(sender, args)
 {
 ActivateAlertDiv('hidden', 'AlertDiv', ''); 
 }
 function ActivateAlertDiv(visstring, elem, msg)
 {
 var adiv = $get(elem); 
 adiv.style.visibility = visstring; 
 adiv.innerHTML = msg; 
 }
  其他的话我们也可以更改控件属性,就如加个onclick事件什么的都可以

  五.另类解决方法

此方法比较的绝,但用起来比较的爽。UpdatePanel之所以无法获取到脚本数据,是因为其获取范围还不够。。。接着的想法是:

  照样无刷新取数据,但取回来的数据跟Postback回来的数据一样。
可能有人说会比较耗性能,那都是相对的。不过也是一个很好的想法。Telerik公司的RadAjaxPanel就是这么实现的,有兴趣的可以下载一个用用 

时间: 2024-09-08 13:39:43

UpdatePanel触发javascript脚本的方法附代码_应用技巧的相关文章

UpdatePanel触发javascript脚本的方法附代码

一.预呈现数据无法更改 1.大家知道,预呈现的数据是无法更改的,以前可能提到过,这里再看demo,自定义一个控件 [DefaultProperty("Text")] [ToolboxData("<{0}:JsControl runat=server></{0}:JsControl>")] public class JsControl : WebControl { [Bindable(true)] [Category("Appeara

ASP实现网页打开任何类型文件都提示保存的方法附代码_应用技巧

相信大家平时都有这样的经历:页面上有一个链接指向服务器一个Word文件,当客户端机器有安装Office时,点击链接将调用Word打开浏览:当客户端机器没有安装Office时,点击链接将弹出保存对话框.总结一下即如果浏览器认识文件类型,就会自动打开:如果不认识,则会提示客户保存.可是有时候我们希望不管什么类型文件,都不要打开,直接让客户端保存.要达到这个要求,对于保存在服务器硬盘上的文件就得利用ASPUpload组件的SendBinary方法来实现,而对于保存在数据库中的文件则只须打开记录集,然后

asp实现的可以提醒生日的几种方法附代码_应用技巧

asp生日自动提醒小程式 用ASP编写,调试通过,使用方便-asp birthday automatically remind small programs with the preparation of ASP, debug, easy to use方法一: 最初写的一个用于班级网站的最近一个月同学生日的提醒小程序.虽然不怎么样,而且很乱,但是最起码是自己动脑筋去想的,所以我比较看重.ASP程序虽然有好多可以借鉴人家的.但是我想更多时候,我们应该在经典上有所突出,有所创新那不至于默守陈规而无永

UpdatePanel触发javascript脚本技巧

相信很多同志都已经遇到这个问题了.这个本身不奇怪.下面我们来具体讨论 此问题. 一.预呈现数据无法更改 1.大家知道,预呈现的数据是无法更改的,以前可能提到过,这里再看demo,自 定义一个控件 [DefaultProperty("Text")] [ToolboxData("<{0}:JsControl runat=server></ {0}:JsControl>")] public class JsControl : WebControl

扩展javascript的Date方法实现代码(prototype)_javascript技巧

最近项目的部分功能正在重构,前端也基本上推翻了原来的设计,在之前半年的积累上有了新的方案.这几天在做前端的重构和设计,遇到了一些问题.因为这个模块最主要的还是对时间的控制,大量的操作js的Date对象,可是js原生的Date方法太少了,操作起来太不方便.于是打算扩展下Date的prototype. 长期从事C#的开发,被C#影响着我的思维.C#中DateTime的操作就很方便,于是就参考它对js的Date做了扩展. 复制代码 代码如下: //将指定的毫秒数加到此实例的值上 Date.protot

NET索引器使用方法实例代码_实用技巧

索引器特性 1.get 访问器返回值.set 访问器分配值.2.this 关键字用于定义索引器.3.value 关键字用于定义由 set 索引器分配的值.4.索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制.5.索引器可被重载.6.索引器可以有多个形参,例如当访问二维数组时.7.索引器使得对象可按照与数组相似的方法进行索引. 代码示例 复制代码 代码如下: class SampleCollection<T>{    private T[] arr = new T[100];   

C#和asp.net中链接数据库中参数的几种传递方法实例代码_实用技巧

复制代码 代码如下: #region 参数传递方法第一种     //参数设置方法(第一种)      //SqlParameter sp = new SqlParameter("@Name", str_Name);      //SqlParameter sp2 = new SqlParameter("@Pwd", str_Pwd);      //cmd.Parameters.Add(sp);      //cmd.Parameters.Add(sp2);  #

清除系统log的方法附批处理文件_应用技巧

什么是日志文件?它是一些文件系统集合,依靠建立起的各种数据的日志文件而存在.在任何系统发生崩溃或需要重新启动时,数据就遵从日志文件中的信息记录原封不动进行恢复.日志对于系统安全的作用是显而易见的,无论是网络管理员还是 黑客都非常重视日志,一个有经验的管理员往往能够迅速通过日志了解到系统的安全性能,而一个聪明的黑客会在入侵成功后迅速清除掉对自己不利的日志.无论是攻还是防,日志的重要性由此可见.下面我们就来简单讨论一下日志文件的清除方法.  一.日志文件的位置  Windows 2000的系统日志文

C#实现Web文件上传的两种方法实例代码_实用技巧

1. C#实现Web文件的上传 使用C#如何实现文件上传的功能呢?下面笔者简要介绍一下. 首先,在你的Visual C# web project 中增加一个上传用的Web Form,为了要上传文件,需要在ToolBox中选择HTML类的File Field控件,将此控件加入到Web Form中,然而此时该控件还不是服务端控件,我们需要为它加上如下一段代码:<input id=PreviousFile1 type=file size=49 runat="server">,这样