Coding with .NET

Live with passion, coding with passion....

首页 新随笔 联系 订阅 管理

在 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>

现在看起来,整个代码就清爽很多了 :)

posted on 2005-06-01 23:53  Lin  阅读(2257)  评论(13编辑  收藏  举报