一起谈.NET技术,asp.net控件开发基础(13)

  1.减轻服务器压力,增加用户体验

  服务器功能是强大的,客户端脚本一点也不弱,现在的ajax技术和Atlas技术就是最好的证明,我们总是期待UI有一个好的效果,flash动画给我们带来了很酷的效果,我们至少也可以为我们的服务器控件添加客户端脚本,一方面减少了服务器端的回传,一方面又能为控件提供非常酷的效果.我想我们都很喜欢ATLAS里面很多很酷的控件吧,而且无刷新,服务器控件与客户端脚本交互使用,那会服务器控件变的更加完美。

  经过上面的废话,下面我们进入正题

  2.简单为服务器控件添加客户端脚本

  我们已经了解到服务器控件呈现后的代码仍然为HTML,只要你熟悉此服务器控件呈现后标签和此标签的元素,你就可以直接在服务器控件中添加属性,事件,样式等等。简单的添加方法如下:

  (1)直接在控件添加属性,如为Button控件添加简单的客户端事件

<asp:Button ID="Button2" runat="server" Text="Button" onmouseover="this.value='鼠标经过'" onmouseout="this.value='鼠标离开'"  />

  (2)使用AttributeCollection在后台添加添加简单的客户端事件,很典型的使用如我们在删除数据的时候总要弹出一个窗口提醒用户是否删除.

Button2.Attributes.Add("onmouseover", "this.value='鼠标经过'");
        Button2.Attributes.Add("onmouseout", "this.value='鼠标离开'");

  3.复杂客户端功能处理

  先不论服务器端的功能,当客户端脚本复杂以后,我们会写在一个js文件里,可以复用,简单的脚本逻辑可以<script>标签内.我们需要封装。Page类为我们提供了几个方法用于实现以下内容,但需要注意的是,asp.net2.0新加了一个类ClientScriptManager,专门用于管理客户端脚本的方法,使用方法为

ClientScriptManager = Page.ClientScript;

  (1)注册脚本库(js文件)                                                   RegisterClientScriptInclude 方法

  (2)发出位于页面顶部和尾部的脚本                                   RegisterStartupScript 方法 和  RegisterClientScriptBlock 方法

  (3)确保脚本块在页面只出现一次                                      以Is带头Registered结尾的四个方法

  (4)将控件事件处理程序与客户端提交事件关联起来              RegisterOnSubmitStatement 方法

  (5)注册一个数组用来存储控件自身变量                             RegisterArrayDeclaration方法

  (6)注册一个隐藏域                                                        RegisterHiddenField 方法

  对于以上方法的具体使用MSDN均给出了具体的示例,刚看的时候感觉方法名比较长,接触后就会感觉简单了,对以上方法的使用一定要了解.如果你不想看MSDN的话,那么推荐看下面几篇文章,相信对你会有很大帮助.还有建议大家可以看下呈现后的HTML代码,这样会加深理解.

  从 ASP.NET 服务器控件插入客户端脚本

  使用客户端脚本

  4.了解预呈现PreRender事件

  这里还是要讲控件的生命周期,在控件呈现Render方法之前,还有一个预呈现OnPreRender 方法.其周期是在OnLoad之后的MSDN给出了其解释在呈现输出之前执行任何更新。可以保存在预呈现阶段对控件状态所做的更改,而在呈现阶段所对的更改则会丢失。总结的话,总是很简单的,要深刻理解的话,还是需要我们去试验一下,再回来体验上面这句话

  先看一个简单的例子,在页面上重写了Page_PreRender,在其事件中给label1赋值,然后再定义了button事件,你会发现button事件触发后label的值还是保持不变.

  示例一

    protected void Page_PreRender(object sender, EventArgs e)
        
    {
        Label1.Text="PreRender";
        
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = "Click";
    }

  再理解上面这句话,可能我们想为什么不在呈现的时候Render方法中实现呢?如果这么做的话,那你就要属性定死了。我们还需要说明一点,不同事件负责不同的事情,Render方法只负责呈现,不要把别的事情交给他做. 你可以在Render方法为控件添加需要呈现的属性,但其他事情则需要在呈现之前完成.整个控件的周期是有阶段,不同阶段完成不同事情。我们这次讨论的是为服务器控件添加客户端脚本,那么我们就要在控件适当的时机调用ClientScriptManager类的方法.而这个适当的时机就是OnPreRender 方法了。

  5.在自定义控件中添加客户端脚本

  (1)简单的实现:你可以重些OnPreRender方法,然后用AttributeCollection的Add方法,添加简单客户端脚本

      protected override void OnPreRender(EventArgs e)
      {
         base.OnPreRender(e);
         Attributes.Add("onclick","alert('" + ClickText + "');");
      }

  (2)复杂的实现: 这里我们用的例子还是简单点吧,效果还是按钮确认之前有一个弹出窗口,重要的是大家要了解ClientScriptManager类中几个方法的使用,以下的代码使用的是 asp.net服务器控件开发技术与实例的实例2 ,我偷懒,直接就用Page里的几个方法的。以下列出代码
  示例二



/// <summary>
/// NormalButton 显示为一个普通样式按钮。
/// 当用户点击按钮之后,跳出一个确认对话框来确定其动作。
/// 通常多用于确认用户是否确实要进行删除/修改等类似的操作。
/// </summary>
[ToolboxData("<{0}:NormalButton runat=server></{0}:NormalButton>")]
public class NormalButton : Button
{
private string _scriptPath = "ControlClientScript/";
//构造函数
public NormalButton():base()
{
Message = "您确实要这样做吗?";
}

定义属性

//重写AddAttributesToRender方法
protected override void AddAttributesToRender(HtmlTextWriter output)
{
Attributes.Add("confirmationmessage",Message);
base.AddAttributesToRender(output);

}

//重写OnPreRender方法
protected override void OnPreRender( EventArgs e )
{
Page.RegisterClientScriptBlock( "WebUIConfirmation", "<script language='javascript' src='" + ScriptPath + "WebUIConfirmation.js" + "'></script>" );
Page.RegisterArrayDeclaration("Page_Confirmations", "'" + ClientID + "'" );
Page.RegisterStartupScript( "WebUIConfirmation Startup", "<script language='javascript' src='" + ScriptPath + "WebUIConfirmationStartup.js" + "'></script>" );
base.OnPreRender(e);
}
}

主要看OnPreRender方法,只要你对其几个方法熟悉后,那剩下就是你对javaScript的掌握程度了.掌握上面几个方法可以说很容易,对javaScript的掌握那需要平时的积累了,所以要开发一个好的控件,并不容易呀。下面再列出js文件,我对其梢有改动WebUIConfirmationStartup.js

ConfirmationOnLoad();

WebUIConfirmation.js


//String去空格
String.prototype.Trim = function()
{
return this.replace(/(^\s*)|(\s*$)/g, "");
}

//初始化获取控件ID
function ConfirmationOnLoad() {
if (typeof(Page_Confirmations) == "undefined") return;
var i, confirmButton;
for (i = 0; i < Page_Confirmations.length; i++) {
confirmButton = Page_Confirmations[i];
if (typeof(confirmButton) == "string") {
confirmButton = document.getElementById( confirmButton );
}
if (typeof(confirmButton.confirmationmessage ) != "undefined" ) {
if ( confirmButton.attributes["confirmationmessage"].value.Trim() != "" ) {
confirmButton.confirmationmessage = confirmButton.attributes["confirmationmessage"].value;
} else {
confirmButton.confirmationmessage = "您确实要这样做吗?";
}
}
ConfirmationHookupControl(confirmButton);

}
}

//添加onclick事件
function ConfirmationHookupControl( confirmButton ) {
var ev = confirmButton.onclick;
if (typeof(ev) == "function" ) {
ev = ev.toString();
ev = ev.substring(ev.indexOf("{") + 1, ev.lastIndexOf("}"));
}
else {
ev = "";
}
var func = new Function("if ( !ConfirmationOnClick( this ) ){return false;} " + ev);
confirmButton.onclick = func;
}

//弹出确认窗口
function ConfirmationOnClick( confirmButton ) {
return window.confirm( confirmButton.confirmationmessage );
}

OK,上面的服务器控件代码还是挺简单的,你看的懂JS的话,那这个效果就没问题了.其实说真的,难点在于JavaScript脚本,呵呵。下面再说一个例子吧,也是asp.net服务器控件开发技术与实例的例子,是一个可伸缩面板控件,其是一个集合属性和客户端脚本一起实现的效果。但此控件却并在呈现页面上用到js脚本,也没重写OnPreRender方法,而是定义了一个HTC,其关键实现是服务器控件的集合属性的实现,还有就是客户端脚本的实现,具体代码可以在后面下载。


  其他:

  1.客户端脚本在服务器控件中的最频繁的使用则是验证控件的使用了,你也可以自定义验证控件,但我感觉用处不是很大,如果需要你可以了解下System.Web.UI.IValidator 接口和System.Web.UI.WebControls.BaseValidator类

  2.另外还有客户端回调,你可以了解下ICallbackEventHandler接口,具体还是看相关文章或者MSDN吧.

  好了又写完一篇了,如果你刚接触这些东西的话,对你还是有帮助的,如果你已经了解了,我上面讲的对你来说就很简单了.还是想那样说,关键在于你对JavaScript的熟练程度.一些东西还需要你自己去挖掘。

上一篇:asp.net控件开发基础(12)

下一篇:asp.net控件开发基础(14)

时间: 2024-10-29 19:56:23

一起谈.NET技术,asp.net控件开发基础(13)的相关文章

ASP.NET控件开发基础(13)

上一篇讨论了如何为子控件添加集合样式,这次我们讨论如何为服务器控件添加客户端功能 . 1.减轻服务器压力,增加用户体验 服务器功能是强大的,客户端脚本一点也不弱,现在的ajax技术和Atlas技术就是最好的证明,我们总是期待UI有一个好的效果,flash动画给我们带来了很酷的效果,我们至少也可以为我们的服务器控件添加客户端脚本,一方面减少了服务器端的回传,一方面又能为控件提供非常酷的效果.我想我们都很喜欢ATLAS里面很多很酷的控件吧,而且无刷新,服务器控件与客户端脚本交互使用,那会服务器控件变

一起谈.NET技术,asp.net控件开发基础(14)

1.错误的代码,无法解析 首先来看一段简单的代码  正确            <asp:Wizard ID="Wizard1" runat="server">                <WizardSteps>                    <asp:WizardStep ID="WizardStep1" runat="server" Title="Step 1"

一起谈.NET技术,asp.net控件开发基础(12)

从第八篇的时候跳了很大篇幅来继续讲属性,然后接着讲类型转换器,再接着讲视图状态.绕到现在才接着讲复合控件的样式的使用,因为上面讲的东西是紧密联系的.如果已经理解自定义视图状态管理,那这一篇则看起来相关的简单. 1.复合控件中样式属性概述 在第六篇的时候已经介绍过样式的使用了,在复合控件中你同样可以用此方法给控件定义多个样式属性,但此方法很适合像label这样非复合控件.当然复合控件可以适当的定义其自身的样式属性,同时你还需要为其子控件提供样式,典型的控件如GridView控件,如下图 它有很多不

一起谈.NET技术,asp.net控件开发基础(15)

继续我们的话题吧.自定义控件.如果你还不熟悉自定义控件开发的话,还请看看我以前写了几篇,希望对你有帮助 1.1何处继承 自定义控件一般从以下几个基类(此处不包含数据控件) 一.Control类(所有服务器控件的基类,算是比较底层的类,如果控件功能比较简单,要求不多,可直接继承此类.) 二.WebControl类(标准控件的基类,继承此类,你可以继承其丰富的公共属性,若标准控件中的控件没有你需要的控件,你可以继承此类) 三.CompositeControl 类(2.0新增的类,此类继承自WebCo

一起谈.NET技术,asp.net控件开发基础(8)

有一些复合控件直接把按钮触发事件所需的事情封装好,另外一种则是自定义事件,更具灵活性,当然这是根据需要设计的.以下会以例子来说明的.下面我们假设我们控件中有两个按钮.以下不列出所有代码,具体可在文章最后下载代码. (1) 直接实现按钮事件 在控件中(以下代码并非实现复合控件)直接实现事件则无需自定义事件,如下代码(如果对数据回传有些不熟悉的话,可先看第三篇,希望对你有帮助) 示例一(只列出局部代码,具体可在文章最后下载代码) void IPostBackEventHandler.RaisePos

一起谈.NET技术,asp.net控件开发基础(2)

或许大家还对为何要重写Render方法存有疑惑,希望大家看看我举的例子,能够明白Render方法和其他两个方法的作用,然后真正明白为何一般情况下只须重写Render方法.我们知道我们每次编写控件时,都需要重写Render方法,我们发现在Control类中很多方法可以重写,但我们没有去重写他们,我们需要遵循一个原则,在需要重载的时候再去重写他们 我们还是先来看看与Render方法相关的两个方法 //RenderControl方法的基本实现 public void RenderControl(Htm

一起谈.NET技术,asp.net控件开发基础(22)

上两篇讨论了如何定义结合数据源控件的数据绑定控件.这次我们一起来看下数据源控件是如何实现的.asp.net2.0已经为我们提供了很多数据源控件,相信大家都用过了,也希望大家对其有所熟悉.关于它能做什么就不说了.下面我们也一起来看看,如何简单的实现. 一.你必须了解的 1.关于数据源控件(DataSourceControl) 虽然表面看来,给数据绑定控件指定DataSourceID属性,数据源控件帮你做了一切工作,其实不然,数据源控件只负责收集与数据交互的相关信息,如:SqlDataSource的

一起谈.NET技术,asp.net控件开发基础(18)

本篇继续上篇的讨论,可能大家已经在使用asp.net2.0了,DataSource属性不再使用,而是跟数据源控件搭配使用.现在讨论的绑定技术都是基于1.1版本,先熟悉一下,本质上是一样的,这样一步步的学习.对以后绝对有帮助.因为当你使用数据源控件,只需要设置一个DataSourceID,方便的同时你是否知道数据源控件帮你做了什么事情,如果你想觉的够用了,可以不用了解,但我相信你一定会有需求.上篇最后说过了,讨论还刚刚开始,我们大致把核心的方法都写出来了.下面我们继续. 一.控件对比 我们可以使用

一起谈.NET技术,asp.net控件开发基础(17)

本篇将开始介绍如自定义数据绑定控件,这里感谢很多人的支持,有你们的支持很高兴.这里首先需要大家熟悉asp.net模板控件的使用,还有自定义模板控件.因为数据绑定控件多是基于模板控件的. 一.回顾 如果你使用过asp.net内置的数据控件(如DataList,Repeater),你一定会这么做 1.设置数据源 DataSource属性 2.调用数据绑定  DataBind方法 3.在控件的不同模板内使用绑定语法显示数据 这三步应该是必须要做的 其他更多的 你可能需要对绑定的数据进行统一的一些操作(