[assembly: webresource("mycontrols.subcontrol.script1.js", "text/javascript")]
namespace mycontrols{
public class subcontrol: control, iscriptcontrol
{
//………
ienumerable<scriptreference> iscriptcontrol.getscriptreferences()
{
return new
scriptreference(this.page.clientscript.getwebresourceurl(
this.gettype(), "mycontrols.subcontrol.script1.js"));
}
}
}
此外,如果我们想实现iscriptcontrol接口而不是从scriptcontrol中继承的话,我们还必须重载onprerender与render方法。这样将能确保scriptmanger识别出该服务器控件是一个支持ajax功能的控件。
|||
下列代码展示了开发基于asp.net 2.0服务器端控件的ajax控件时必须在服务器端实现的最少代码:
using system;
using system.collections.generic;
using system.web;
using system.web.ui;
using system.web.ui.webcontrols;
namespace dummynamespace
{
public class dummycontrol : control, iscriptcontrol
{
public dummycontrol(): base()
{}
protected override void onprerender(eventargs e)
{
base.onprerender(e);
scriptmanager scriptmanager = scriptmanager.getcurrent(page);
if (scriptmanager == null)
{
throw new invalidoperationexception(
"此页面中必须存在一个scriptmanager控件!");
}
scriptmanager.registerscriptcontrol(this);
}
protected override void render(htmltextwriter writer)
{
base.render(writer);
writer.addattribute(htmltextwriterattribute.id, this.clientid);
writer.renderbegintag(htmltextwritertag.div);
writer.write("这是一个哑元控件");
writer.renderendtag();
if (!designmode) {
scriptmanager.getcurrent(this.page).registerscriptdescriptors(this);
}
}
ienumerable<scriptdescriptor> iscriptcontrol.getscriptdescriptors()
{
//因为这仅是一个哑元控件,所以我们只是创建一个新的实例
return new scriptcontroldescriptor("dummynamespace.dummycontrol", clientid);
}
ienumerable<scriptreference> iscriptcontrol.getscriptreferences()
{
return new scriptreference(page.resolveurl("~/dummycontrol.js"));
}
}
}
上面代码中,我们在onprerender方法中实现注册控件,而在render方法中注册脚本描述符部分。当然,如果页面上不存在scriptmanager控件的话,我们必须抛出一个错误提示。但是,如果你正在开发非基于asp.netajax框架的控件的话,你完全可以从页面中删除scriptmanager控件。
五、创建基于asp.net服务器端控件的增强ajax图像控件
(一)创建示例ajax网站
启动visual studio 2005,选择“文件→新建网站…”,然后选择“asp.net ajax-enabled web site”模板,命名工程为“ajaxservctrltest”,并选择c#作为内置支持语言,最后点击“确定”。
(二)创建ajax技术支持的增强服务器控件
点击菜单“文件→添加→新建项目…”,在“添加新项目”对话框中,从左边选择“项目类型”为“visual c#→windows”,从右边选择“模板类型”为“web控件库”,输入控件库的名字为ajaximagebuttonlib,选择目标目录为前面创建的网站根目录,最后点击“确定”。
接下来,根据我们前面的分析,把类库源webcustomcontrol1.cs文件的内容更改为以下形式:
//…………(省略命名空间引用部分)
namespace ajaximagebuttonlib
{
public class mysrvimagebutton :
system.web.ui.webcontrols.imagebutton, iscriptcontrol
{
public string hoverimageurl
{
get
{
object value = viewstate["hoverimageurl"];
return (value == null) ? string.empty : (string)value;
}
set
{
viewstate["hoverimageurl"] = value;
}
}
public string clientclickfunction
{
get
{
object value = viewstate["clientclickfunction"];
return (value == null) ? string.empty : (string)value;
}
set
{
viewstate["clientclickfunction"] = value;
}
}
public mysrvimagebutton()
: base()
{
}
protected override void onprerender(eventargs e)
{
base.onprerender(e);
scriptmanager scriptmanager = scriptmanager.getcurrent(page);
if (scriptmanager == null)
{
throw new invalidoperationexception
("scriptmanager required on the page.");
}
scriptmanager.registerscriptcontrol(this);
}
protected override void render(htmltextwriter writer)
{
base.render(writer);
if (!designmode)
{
scriptmanager.getcurrent(this.page).registerscriptdescriptors(this);
}
}
ienumerable<scriptdescriptor> iscriptcontrol.getscriptdescriptors()
{
scriptcontroldescriptor desc =
new scriptcontroldescriptor("ajaximagebuttonlib.mysrvimagebutton", clientid);
if (!string.isnullorempty(hoverimageurl))
{
desc.addproperty("hoverimageurl", hoverimageurl);
}
if (!string.isnullorempty(clientclickfunction))
{
desc.addevent("click", clientclickfunction);
}
yield return desc;
}
ienumerable<scriptreference> iscriptcontrol.getscriptreferences()
{
yield return new scriptreference(page.resolveurl("~/srvimagebutton.js"));
}
}
}
首先,我们注意到我们要创建的新控件mysrvimagebutton继承自asp.net服务器控件imagebutton,并继承了接口iscriptcontrol。
|||
有了前面的理论描述,在此,我们省略对于其中几个常规方法的描述。
接下来,我们要构建这个控件库(即程序集)。右击此库工程,并点击“生成”命令以生成程序集ajaximagebuttonlib.dll,此库文件中即包含了我们的服务器控件。
(三)创建客户端javascript代码
这里创建的客户端控件类相应的javascript文件imagebutton.js在内容上完全相同,只不过为了区别起见,我们进行了某些地方的重新命名罢了。在此不再赘述。
(四)在示例网页中应用构建的新控件