Asp.net组件设计浅论
当然,这些验证代码不能由用户去写,应该由组件设计者去写,也就是说,当用户把该组件从工具箱中拖到页面上后,运行时应该自动生成验证代码。向web页绘制代码,我们重写onprerender()方法就可以了。
在重写onprerender()方法之前,先写定义几个常量:
在重写onprerender()方法之前,先写定义几个常量:
private const string scp_number_only_script_id="{29fd7a41-49fd-4fc4-afa9-6a0b875a1a51}";
private const string scp_number_only_hook="return virty(this);";
private const string scp_number_only_script=
"<script language=\"javascript1.2\">\nfunction virty (ctrl)\n{{\n"+
"if (event.keycode == 13)\n return true;\n if (event.keycode < 48 || event.keycode > 57)\n return false;\n else\n return true;\n}}"+
"</script>";
下面的方法用于验证代码的生成:
private void renderjavascript()
...{
if(!page.isclientscriptblockregistered(scp_number_only_script_id)) page.registerclientscriptblock(scp_number_only_script_id,string.format(scp_number_only_script,base.id));
}
为什么会有page.isclientscriptblockregistered(scp_number_only_script_id)呢?我们想象一下,如果在web页中有十个该控件,那是不是就要输出十个这样的脚本?显然,这是画蛇添足了,所以,我们要用isclientscriptblockregistered()判断该脚本是否在客户端输出,如果脚本在客户端已注册,则不再输出了。
接下来就是重写onprerender()方法了,该方法负责向客户端绘制脚本。
大家应该注意到,该脚本需要事件触发才会执行,当用户从浏览器输入数据时,如果是非数字,则忽略该动作,否则才接受输入。这就需要onkeypress="javascript:return virty(this);"这段代码了。那么,这段代码怎么向客户端输出呢?重写addattributestorender()方法吧,该方法负责绘制组件的属性。于是,我们写了下面一段代码:
protected override void addattributestorender(htmltextwriter writer)
...{
base.addattributestorender(writer);
writer.addattribute("onkeypress",scp_number_only_hook);
}
最后的源码如下:
最后代码#region 最后代码
using system;
![]()
using system.text;
![]()
using system.drawing;
![]()
using system.web;
![]()
using system.web.ui;
![]()
using system.web.ui.webcontrols;
![]()
namespace powerasp.net.controls
![]()
...{
![]()
[toolboxbitmap(typeof(numbereditor),"powerasp.net.controls.numbereditor.bmp")]
![]()
public class numbereditor:baseeditor
![]()
...{
![]()
private const string scp_number_only_script_id="{29fd7a41-49fd-4fc4-afa9-6a0b875a1a51}";
![]()
private const string scp_number_only_hook="return numbereditor_keypress_handle(this);";
![]()
private const string scp_number_only_script=
![]()
"<script language=\"javascript1.2\">\nfunction numbereditor_keypress_handle(ctrl)\n{{\n"+
![]()
"if (event.keycode == 13)\n return true;\n if (event.keycode < 48 || event.keycode > 57)\n return false;\n else\n return true;\n}}"+
![]()
"</script>";
![]()
//rending number-limit javascript.
![]()
private void renderjavascript()
![]()
...{
![]()
if(!page.isclientscriptblockregistered(scp_number_only_script_id)) page.registerclientscriptblock(scp_number_only_script_id,string.format(scp_number_only_script,base.id));
![]()
}
![]()
protected override void addattributestorender(htmltextwriter writer)
![]()
...{
![]()
base.addattributestorender(writer);
![]()
writer.addattribute("onkeypress",scp_number_only_hook);
![]()
}
![]()
protected override void onprerender(eventargs e)
![]()
...{
![]()
base.onprerender (e);
![]()
renderjavascript();
![]()
}
![]()
public numbereditor():base()
![]()
...{
![]()
}
![]()
}
![]()
}
#endregion
0
相关文章
