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

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

  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)
目录
相关文章
|
11天前
|
人工智能 开发框架 量子技术
【专栏】.NET 技术:驱动创新的力量
【4月更文挑战第29天】.NET技术,作为微软的开发框架,以其跨平台、开源和语言多样性驱动软件创新。它在云计算、AI/ML、混合现实等领域发挥关键作用,通过Azure、ML.NET等工具促进新兴技术发展。未来,.NET将涉足量子计算、微服务和无服务器计算,持续拓宽软件开发边界,成为创新的重要推动力。掌握.NET技术,对于开发者而言,意味着握有开启创新的钥匙。
|
11天前
|
开发框架 .NET C#
【专栏】理解.NET 技术,提升开发水平
【4月更文挑战第29天】本文介绍了.NET技术的核心概念和应用,包括其跨平台能力、性能优化、现代编程语言支持及Web开发等特性。文章强调了深入学习.NET技术、关注社区动态、实践经验及学习现代编程理念对提升开发水平的重要性。通过这些,开发者能更好地利用.NET构建高效、可维护的多平台应用。
|
11天前
|
机器学习/深度学习 vr&ar 开发者
【专栏】.NET 技术:引领开发新方向
【4月更文挑战第29天】本文探讨了.NET技术如何引领软件开发新方向,主要体现在三方面:1) 作为跨平台开发的先锋,.NET Core支持多操作系统和移动设备,借助.NET MAUI创建统一UI,适应物联网需求;2) 提升性能和开发者生产力,采用先进技术和优化策略,同时更新C#语言特性,提高代码效率和可维护性;3) 支持现代化应用架构,包括微服务、容器化,集成Kubernetes和ASP.NET Core,保障安全性。此外,.NET还不断探索AI、ML和AR/VR技术,为软件开发带来更多创新可能。
|
11天前
|
开发框架 Cloud Native 开发者
【专栏】剖析.NET 技术的核心竞争力
【4月更文挑战第29天】本文探讨了.NET框架在软件开发中的核心竞争力:1) .NET Core实现跨平台与云原生技术的融合,支持多操作系统和容器化;2) 提升性能和开发者生产力,采用JIT、AOT优化,提供C#新特性和Roslyn编译器平台;3) 支持现代化应用架构,包括微服务和容器化,内置安全机制;4) 丰富的生态系统和社区支持,拥有庞大的开发者社区和微软的持续投入。这些优势使.NET在竞争激烈的市场中保持领先地位。
|
11天前
|
开发框架 .NET 开发者
【专栏】领略.NET 技术的创新力量
【4月更文挑战第29天】.NET技术自ASP.NET起历经创新,现以.NET Core为核心,展现跨平台能力,提升性能与生产力,支持现代化应用架构。.NET Core使开发者能用同一代码库在不同操作系统上构建应用,扩展至移动和物联网领域。性能提升,C#新特性简化编程,Roslyn编译器优化代码。拥抱微服务、容器化,内置安全机制,支持OAuth等标准。未来.NET 6将引入更快性能、Hot Reload等功能,预示着.NET将持续引领软件开发潮流,为开发者创造更多机会。
|
11天前
|
物联网 vr&ar 开发者
【专栏】.NET 技术:为开发注入活力
【4月更文挑战第29天】本文探讨了.NET技术的创新,主要体现在三个方面:1) .NET Core实现跨平台开发革命,支持多种操作系统和硬件,如.NET MAUI用于多平台UI;2) 性能提升与生产力飞跃,C#新特性简化编程,JIT和AOT优化提升性能,Roslyn提供代码分析工具;3) 引领现代化应用架构,支持微服务、容器化,内置安全机制。未来,.NET 7将带来更多新特性和前沿技术整合,如量子计算、AI,持续推动软件开发创新。开发者掌握.NET技术将赢得竞争优势。
|
11天前
|
人工智能 前端开发 Cloud Native
【专栏】洞察.NET 技术的开发趋势
【4月更文挑战第29天】本文探讨了.NET技术的三大发展趋势:1) 跨平台与云原生技术融合,通过.NET Core支持轻量级、高性能应用,适应云计算和微服务;2) 人工智能与机器学习的集成,如ML.NET框架,使开发者能用C#构建AI模型;3) 引入现代化前端开发技术,如Blazor,实现前后端一致性。随着.NET 8等新版本的发布,期待更多创新技术如量子计算、AR/VR的融合,.NET将持续推动软件开发的创新与进步。
|
4月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
46 0
|
15天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
21 0
|
2月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
32 0