技术开发 频道

Asp.net组件设计浅论

    当然,这些验证代码不能由用户去写,应该由组件设计者去写,也就是说,当用户把该组件从工具箱中拖到页面上后,运行时应该自动生成验证代码。向web页绘制代码,我们重写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); }

    最后的源码如下:

最后代码
0
相关文章