AJax技术

探讨微软ASP.NET AJAX控件开发技术(服务器端)(2)

字号+ 作者:H5之家 来源:H5之家 2015-11-04 09:34 我要评论( )

[assembly: webresource(mycontrols.subcontrol.script1.js, text/javascript)] namespace mycontrols public class subcontrol: control, iscriptcontrol // ienumerablescriptreference iscriptcontrol.getscript

[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控件。

  • 本文来源于网页设计爱好者web开发社区收集整理,欢迎访问。
  • |||

      五、创建基于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在内容上完全相同,只不过为了区别起见,我们进行了某些地方的重新命名罢了。在此不再赘述。

      (四)在示例网页中应用构建的新控件

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • 技巧和诀窍:UpdateProgress控件和AJAX活动图像动画

      技巧和诀窍:UpdateProgress控件和AJAX活动图像动画

      2016-01-23 13:00

    • AtlasUpdatePanel技巧及常见问题

      AtlasUpdatePanel技巧及常见问题

      2016-01-22 18:13

    • AJAX开发技术在PHP开发中的简单应用技巧(5)

      AJAX开发技术在PHP开发中的简单应用技巧(5)

      2016-01-15 09:27

    • AJAX开发技术在PHP开发中的简单应用技巧(2)

      AJAX开发技术在PHP开发中的简单应用技巧(2)

      2016-01-15 09:10

    网友点评
    o