30 Apr 2004

可以弹出确认对话框的自定义Web服务器控件ConfirmButton

经常在论坛里看到类似这样的问题:“如何在点击删除按钮的时候弹出个确认删除对话框”。

下面我们来自己写一个这样的自定义Web服务器控件!

思路如下:

继承System.Web.UI.WebControls.Button控件

增加一个属性“ConfirmMessage”来表示弹出确认框上面的提示信息。

在服务器控件呈现在页面之前把一段javascript写到页面

内容如下:

<script language="JavaScript">

<!--

function _doAspxBoyConfirm()

{

return confirm("你确认删除/保存吗??")

}

//-->

</script>

查一下msdn中对于Control.OnPreRender 方法的描述

可以得到“此方法通知服务器控件在保存视图状态和呈现内容之前,执行任何必要的预呈现步骤”.

所以我们只要在OnPreRender方法内 Page.RegisterClientScriptBlock把这段javascript发送到客户端,并且给Button. Attributes属性内添加一个“onclick”的客户端属性对应值为: "return _doAspxBoyConfirm()”.

详细情况可以查阅

ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemwebuiwebcontrolswebcontrolclassattributestopic.htm

这样一个具有ConFirm功能的Button就基本上建立起来了。

新建一个测试该控件的工程

在工具箱上点右键选择“添加/移除项”,点击浏览选择编译好的dll文件,点击确定,你会发现ConFirmButton已经添加到工具箱内了

将其托到一个Aspx页面内 在属性设置内给ConfirmMessage值为你要的弹出框内容比如“确定删除吗?”,按F5运行。

当点该按钮时会弹出一个confirm对话框询问“确定删除吗?,如果点击确定则执行buttonButton_Click事件,如果点击取消则不执行。

你可以查看他生成的html代码,以加深对该控件工作原理的理解

完整的代码如下:

using System;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.ComponentModel;

using System.Text;

 

namespace AspxBoy.Com.ConfirmButton

{

       /// <summary>

       /// Button点击时会弹出一个对话框要求确认

       /// </summary>

       public class ConfirmButton : System.Web.UI.WebControls.Button

       {

              private string _confirmMessage;

              /// <summary>

              /// 当客户端点击此Button时弹出的提示消息筐的内容

              /// </summary>

              public string ConfirmMessage

              {

                     get

                     {

                            return _confirmMessage;

                     }

 

                     set

                     {

                            _confirmMessage = value;

                     }

              }

 

              protected override void OnPreRender(System.EventArgs e)

              {

                     StringBuilder sb = new StringBuilder();

                     sb.Append("<script language=\"JavaScript\">");

                     sb.Append(System.Environment.NewLine);

                     sb.Append("<!--");

                     sb.Append(System.Environment.NewLine);

                     sb.Append("/*--------------------------------------------");

                     sb.Append(System.Environment.NewLine);

                     sb.Append("ControlName:\t\tAspxBoy.Com.ConfirmButton");

                     sb.Append(System.Environment.NewLine);

                     sb.Append("AuthorName:\t\t\tHuobazi,WuMeibo");

                     sb.Append(System.Environment.NewLine);

                     sb.Append("CopyRight:\t\t\twww.github.Com");

                     sb.Append(System.Environment.NewLine);

                     sb.Append("---------------------------------------------*/");

                     sb.Append(System.Environment.NewLine);

                     sb.Append("function _doAspxBoyConfirm()");

                     sb.Append(System.Environment.NewLine);

                     sb.Append("{");

                     sb.Append(System.Environment.NewLine);

                     sb.Append("return confirm(\"");

                     sb.Append(ConfirmMessage);

                     sb.Append("\")");

                     sb.Append(System.Environment.NewLine);

                     sb.Append("}");

                     sb.Append(System.Environment.NewLine);

                     sb.Append("//-->");

                     sb.Append("</script>");

                     Page.RegisterClientScriptBlock("_doAspxBoyConfirm",sb.ToString());

                     this.Attributes.Add("onclick","return _doAspxBoyConfirm()");

                     base.OnPreRender(e);

              }

              public override void RenderBeginTag(HtmlTextWriter writer)

              {

                     writer.WriteLine();

                     writer.Write("<!-------------------");

                     writer.Write("AspxBoy.Com.ConfirmButton Start");

                     writer.Write("\tAuthorName: \tHuobazi");

                     writer.WriteLine(" --------------------->");

                     writer.Write("<!-------------------- ");

                     writer.Write("Copyright:2004 Huobazi(www.github.com)");

                     writer.Write(" ---------------------");

                     writer.WriteLine(">");

                     base.RenderBeginTag(writer);

              }

              public override void RenderEndTag(HtmlTextWriter writer)

              {

                     base.RenderEndTag(writer);

                     writer.WriteLine();

                     writer.Write("<!------------------------------- ");

                     writer.Write("AspxBoy.Com.ConfirmButton  End");

                     writer.Write(" --------------------------------");

                     writer.WriteLine(">");

                     writer.WriteLine();

              }

       }

}