再谈客户端脚本与 WebControl [zz]
2005-06-02 00:30
369 查看
http://www.cnblogs.com/chenglin/archive/2005/06/01/166372.html
在 asp.net 中,在为服务器端控件添加客户端脚本(比如 onclick 事件)时,比较常用的方法就是设置此服务器端控件的 Attributes。比如: control.Attributes["onclick"] = "return(window.confirm('....'));"; 。然而,在使用上述方法的时候,我们必须要拥有此控件的引用。可是,在某些情况下,我们是不太好获取(或者说获取非常麻烦)所需要的控件的引用的。比如在一个 DataGrid 控件中,需要为一个用于删除的控件添加确认的脚本:
1 <asp:DataGrid runat="server" >
2 <Columns>
3 <asp:TemplateColumn>
4 <ItemTemplate>
5 <asp:LinkButton runat="server" CommonName="Delete"> 删除 <asp:LinkButton>
6 </ItemTemplate>
7 </asp:TemplateColumn>
8 </Columns>
9 </asp:DataGrid>
要实现上述的功能,我们当然希望像普通 html 控件那样设置一下某个属性就可以了。可是,大家也知道,asp.net 会将设置的 onclick属性之当成是服务器的方法而不能编译成功。最后,可能还需要使用 DataGrid.ItemCreate 等,非常麻烦。
再仔细想想,其实我们的目的只是需要在此 LinkButton 控件被显示(也就是在 Render 方法被执行)之前在它的 Attributes 属性里面设置 onclick。既然这样,我们可以写一个从 System.Web.UI.WebControls.LinkButton 类继承的子类,它负责设置 onclick 值的这个工作。代码如下:
1 using System;
2 using System.Web.UI;
3 using System.Web.UI.WebControls;
4
5 namespace Chenglin.WebControls
6 {
7 [ToolboxData("<{0}:ScriptLinkButton runat=server />")]
8 public class ScriptLinkButton : System.Web.UI.WebControls.LinkButton
9 {
10 private string _script;
11
12 [ Bindable(true) ]
13 [ Category("Appearance") ]
14 [ DefaultValue("") ]
15 public string Script
16 {
17 get { return _script; }
18 set { _script = value; }
19 }
20
21 protected override void Render(HtmlTextWriter writer)
22 {
23 if( _script!=null && _script.Length>0 ) {
24 Attributes[ "onclick" ] = _script;
25 }
26 base.Render( writer );
27 }
28
29 }
30 }
31
使用上面的控件,我们就可以将上述代码改写成:
1 <asp:DataGrid runat="server" >
2 <Columns>
3 <asp:TemplateColumn>
4 <ItemTemplate>
5 <chenglin:ScriptLinkButton
6 Script="return(window.confirm('Are you sure?'));"
7 runat="server" CommonName="Delete"> 删除
8 <chenglin:ScriptLinkButton>
9 </ItemTemplate>
10 </asp:TemplateColumn>
11 </Columns>
12 </asp:DataGrid>
现在看起来,整个代码就清爽很多了 :)
在 asp.net 中,在为服务器端控件添加客户端脚本(比如 onclick 事件)时,比较常用的方法就是设置此服务器端控件的 Attributes。比如: control.Attributes["onclick"] = "return(window.confirm('....'));"; 。然而,在使用上述方法的时候,我们必须要拥有此控件的引用。可是,在某些情况下,我们是不太好获取(或者说获取非常麻烦)所需要的控件的引用的。比如在一个 DataGrid 控件中,需要为一个用于删除的控件添加确认的脚本:
1 <asp:DataGrid runat="server" >
2 <Columns>
3 <asp:TemplateColumn>
4 <ItemTemplate>
5 <asp:LinkButton runat="server" CommonName="Delete"> 删除 <asp:LinkButton>
6 </ItemTemplate>
7 </asp:TemplateColumn>
8 </Columns>
9 </asp:DataGrid>
要实现上述的功能,我们当然希望像普通 html 控件那样设置一下某个属性就可以了。可是,大家也知道,asp.net 会将设置的 onclick属性之当成是服务器的方法而不能编译成功。最后,可能还需要使用 DataGrid.ItemCreate 等,非常麻烦。
再仔细想想,其实我们的目的只是需要在此 LinkButton 控件被显示(也就是在 Render 方法被执行)之前在它的 Attributes 属性里面设置 onclick。既然这样,我们可以写一个从 System.Web.UI.WebControls.LinkButton 类继承的子类,它负责设置 onclick 值的这个工作。代码如下:
1 using System;
2 using System.Web.UI;
3 using System.Web.UI.WebControls;
4
5 namespace Chenglin.WebControls
6 {
7 [ToolboxData("<{0}:ScriptLinkButton runat=server />")]
8 public class ScriptLinkButton : System.Web.UI.WebControls.LinkButton
9 {
10 private string _script;
11
12 [ Bindable(true) ]
13 [ Category("Appearance") ]
14 [ DefaultValue("") ]
15 public string Script
16 {
17 get { return _script; }
18 set { _script = value; }
19 }
20
21 protected override void Render(HtmlTextWriter writer)
22 {
23 if( _script!=null && _script.Length>0 ) {
24 Attributes[ "onclick" ] = _script;
25 }
26 base.Render( writer );
27 }
28
29 }
30 }
31
使用上面的控件,我们就可以将上述代码改写成:
1 <asp:DataGrid runat="server" >
2 <Columns>
3 <asp:TemplateColumn>
4 <ItemTemplate>
5 <chenglin:ScriptLinkButton
6 Script="return(window.confirm('Are you sure?'));"
7 runat="server" CommonName="Delete"> 删除
8 <chenglin:ScriptLinkButton>
9 </ItemTemplate>
10 </asp:TemplateColumn>
11 </Columns>
12 </asp:DataGrid>
现在看起来,整个代码就清爽很多了 :)
相关文章推荐
- 再谈客户端脚本与 WebControl
- 【脚本语言系列】关于PythonWeb客户端标准库requests,你需要知道的事情
- 向 ASP.NET Web 服务器控件添加客户端脚本事件
- ASP.NET 添加 AJAX 和客户端功能_第一篇_将客户端脚本添加到 ASP.NET Web 应用程序中
- UltraWebGrid客户端脚本事件
- 使用 WebResourceCompression 压缩客户端脚本的方法
- webControls与客户端脚本路径
- javascript客户端操作下拉选择框[select or dropdownlist(.net webcontrol)]
- webControls与客户端脚本路径
- rsync由svn所在的客户端向web服务器实时推送脚本及其文件的方法
- 常见web攻击-客户端脚本安全
- 通过使用客户端证书调用 Web 服务进行身份验证(zz)
- 在Web Control中用资源保存java script脚本
- nagios 客户端扩展脚本检测批量url web 状态
- 从客户端脚本调用 Web 服务
- ultrawebgrid服务器端变量与客户端JScript脚本变量的互操作
- 如何获取正确的 AJAX Control Toolkit 客户端控件脚本
- 向 ASP.NET Web 服务器控件添加客户端脚本事件
- 在 Web 应用程序中定义用于管理客户端脚本的方法。
- 向 ASP.NET Web 服务器控件添加客户端脚本事件