`
prec
  • 浏览: 65407 次
  • 性别: Icon_minigender_1
  • 来自: 互联网
最近访客 更多访客>>
社区版块
存档分类
最新评论

基于css样式绑定的样式驱动式AJAX程序开发(.net实现)

阅读更多

序言:
     前面我介绍了我做的.net版的ajax库(.NET下的简单AJAX处理库 ),现在要介绍的是一种开发模式:样式绑定式驱动开发。
     样式驱动是我自己命名的,(我也不知道它叫什么,嘿嘿)以便区别目前的请求驱动式开发(如struts、webwork等)和事件驱动式开发(如asp.net、JSF等)。
正文:
1  简介
   首先,让我们来看看传统的WEB开发流程:
   ·请求驱动:   最常见的一类WEB框架实现了以请求驱动的流程。一个HTTP请求近来,被一个通用的分发器Servlet
(Dispather Servlet)分析,再被分发到一个对应的应用处理器。处理器依次处理UI特有的控制逻辑,调用业务对象和处理会
话状态,准备一个模型,再转发到视图。
   ·事件驱动:   事件驱动框架的设计目标是将桌面UI编程中著名的事件驱动模式搬到WEB环境中来。其特征是;对于如何将
表单提交到URL、如何将URL映射到控制器这些问题它们不关心;在事件驱动的框架中,表单组件和监听器联系在一起,监听器
通过事件开调用。而且,这类框架通常不打算实现可插拔的试图技术来呈现给特定的模型对象,而是把WEB页看作一写列界面组
件的组合物,每个组件可以保持自己的状态,并且知道如何呈现自己,甚至可能使用不同界面皮肤。
   从上面可以看到一个是传统的MVC架构是开发,一个是以页面为中心的快速应用开发(RAD)两者各有各的好处。
  
   样式驱动式开发在请求驱动开发或事件驱动开发的基础上进行简单的封装,在界面层融合了以上两者概念优势,它以最前台
的界面层为基础,通过CSS样式或HTC事件绑定界面元素来执行相应后台业务,从而达到执行相应请求,处理相应的事件的目的

   样式驱动的优势在于只需把前台元素赋予特定的样式,即可实现特殊的动能以及特定的业务处理,从而减少编码量和编译的
次数,具有“一次编写,到处绑定”的特点。比传统开发复用性更强。尤其是在AJAX大行其道的今天,在请求驱动框架或事件
驱动现有框架的基础上利用样式绑定式开发基于AJAX的应用,你会发现你的AJAX程序的开发效率会提高很多,尤其是当反复应
用同一(或相似)后台逻辑的情况会更明显,同样,样式绑定式开发对于面向服务式开发也具有很大的优势。
   
2  基于ASP.NET的样式驱动开发                    
  
   样式驱动的操作不依赖与后台实现,asp.net的runat=server可以魔法搬地将前台元素转化为后台的元素,不过这样的转化
依赖于特定的元素和后台,比如<input type=text runat=server> 这样确实是将input元素扩展成后台可以使用的服务器元素
了,但是对于后台来讲他要在页面对应的里进行特定的处理,而且input type=text只能是input type=text也不可能扩展自己
的功能。样式驱动则可以把一切元素、控件或控件中的元素利用JS的强大功能在前台转换为你想要的功能和效果,然后再送入
原请求或自定义请求,从而弥补asp.net的一些不足,“一次编写,到处绑定”的特点也为我们省去了多个页面类写重复代码的
诸多困扰。
   
    也许你会说不是有用户控件吗,很抱歉,用户控件跟前台严重耦合,你将它拿到一个项目中也许派不上一点用场。

    那WEB控件库呢?虽然能重用,跟用户控件比不耦合了,但是局限性太强,复杂度高,我觉得叫一个普通程序员写一个带模
板项的DataGird能排序的,可以删除、修改、上移下移]可以查看详细信息的控件出来是一件很费事的事。

    又有人说了,真笨,我直接拖一个DATAGRID然后再这个基础上加按纽,模板列,排序,详细连接好不好啊,还用特意做个
控件吗?有很抱歉的告诉你,如果是1000个DATAGIRD,每一个都有这些功能的一种或几种,那么你后台够写的了,即使你抽象
出一层、封装出一个专门的DataGirdBuilder类,也够复杂的,各种重载方法,晕。

    那么使用样式绑定式的开发就简单了,给DataGird个排序的样式(比如CssClass=sort),后台几句代码,或者干脆不写(
你的准备比较充足),就可以了,再加个列变为删除按钮(比如其中的一个列里ItemStyle CssClass="delbtn"),就可以了,
别的DataGrid不需要排序,那么样式去掉。而后页面类里干干静静。样式绑定后变化的元素传值到统一的业务对象进行处理,
一切都很规矩。

3  实现
   利用我之前做过的AJAX库,再结合Javascript脚本构建一个这样的库不成问题。自然,跟做烧饭做菜一样,这里选料非常的
重要,这里我要选用来自Dean Edwards和Tino Zijdel的事件操作脚本库(common.js)和Neil Cro~~~~y制作的样式基本操作库(
css.js)来做好我们这道美味,噢,当然,还有大名鼎鼎的prototype.js库.
  
  
   好了,,前台的制作工序基本完成。
   然后就是利用我前一阵子做的AJAX库了。
   假设是删除,QueryString: command=delrow&JS生成的参数……
   则后台调用AjaxDelRow.cs 

protected override void DoAjax()
...{
  
// 搜集参数
  string parlist = request.Params["pars"];
  string[] paritem 
= parlist.Split('|');
  Hashtable hash 
= new Hashtable(paritem.Length);
  
for(int i=0;i<paritem.Length-1;i++
  
...{
   string[] paritempart 
= paritem[i].Split('^');
   hash.Add(paritempart[
0],paritempart[1]);
  }


  bool isDeled 
= false;
  string table 
= request.Params["table"];
                
// 判断来源
  if(table!=null
  
...
                
if(table.Equals("dgBigclassmanage"))   //DATAGRID的ID号
                ...{   
   
// 调用对应业务外观的DAO来删除
   // hash["0"]为datagrid的第0列,假设第0列传过来是ID值
                    isDeled = (new BusinessFacade()).DeleteById(hash["0"].ToString());
                }

                
if(isDeled) 
               
...{
                    Output(
"true");
                }

                
else 
               
...{
                        Output(
"false");
                 }

}

AjaxDelRow制作流程请参考.NET下的简单AJAX处理库

好了,完成删除,,那么所有对应这个业务的删除都可以由命名为dgBigclassmanage的某一元素通过绑定delbtn样式来执行删
除(当然,这样不科学,不过是DEMO嘛,如果是实际你可以在QueryString里多传一个参数,在到AjaxDelRow派发后再用进行二
次派发,然后以这个参数做标识就完美了)由于麻烦,,有兴趣的自己做吧。。  呵呵。

这个样式只依赖TABLE元素,所以DATAGRID、DATALIST、自己做的TABLE,自定义控件只要最后生成TABLE元素的控件都可以用。
   主要提供一个思想,跟代码制作的好坏无关。在.NET里轻量地使用样式绑定,在有AJAX应用的开发中效果很棒。你也可以自己去实现一个更优秀的轻量框架了。

增删改、上下移动记录样式绑定的JS: 

   /**//**
 * Written by Wangzhongyuan
 * 
 * 这是一个样式驱动的功能按钮控制脚本,样式用法如下:
 *
 *    修改按钮样式:       editgtn    应用样式后即可把目标元素变为修改按钮,目标行变为修改行并出现确定、取消按钮。
 *    删除按钮样式:       delbtn     应用样式后即可把目标元素变为删除按钮,点击删除则目标删除。
 *    上移下移按钮样式:   updownbtn  应用样式后即可把目标元素变为上移、下移元素,目标行变为可上移和下移。
 *    
 *    其他需要样式正在制作中........
 *
*/

var crudbtn = ...{
    that: 
false,
    isOdd: 
false,
    lastAssignedId : 
0,
    addbtnid : 
0,
    newRows: 
-1,
    init : 
function() ...{
        
// 首先, 查看浏览器是否能执行此脚本(有些浏览器不能用getElementsByTagName)
        if (!document.getElementsByTagName) ...{
            
return;
        }


        
this.that = this;

        
this.run();
        
    }
,
    
/**//**
     *  遍历document中的所有table,如果有样式crudtable,则应用此脚本
     *
     *
*/

    run : 
function() ...{
        
var tables = document.getElementsByTagName("table");
        
        
for (var i=0; i < tables.length; i++...{
            
var thisTable = tables[i];
            
            
if (css.elementHasClass(thisTable, 'crudtable')) ...{
                
this.makecrudTable(thisTable);
            }

        }

    }
,
    
/**//**
     *   构建控制按钮
     *
*/

    makecrudTable : 
function(table) ...{

        
// 首先, 检测table是否有id,如果没有则创建
        if (!table.id) ...{
            table.id 
= 'crudTable'+this.lastAssignedId++;
        }

        
// 遍历表格的数据行
        var newRows = new Array();
        
// 遍历表格所有数据行
        for (var j = 0; j < table.tBodies[0].rows.length-1; j++...{
            
// 遍历数据行所有列
            for(var k = 0;k < table.tBodies[0].rows[j+1].cells.length;k++...{
                
// 判断是否存在删除样式,如果存在则把该单元个转化为删除按钮
                if(css.elementHasClass(table.tBodies[0].rows[j+1].cells[k], 'delbtn')) ...{
                    table.tBodies[
0].rows[j+1].cells[k].id = 'delbtn'+this.addbtnid ++;
                    
var linkEl = createElement('a');
                    linkEl.href 
= '#';
                    linkEl.onclick 
= this.delRow;
                    linkEl.setAttribute(
'columnId', k);
                    
                    
var innerEls = table.tBodies[0].rows[j+1].cells[k].childNodes;

                    linkEl.innerText 
= "删除";
                    table.tBodies[
0].rows[j+1].cells[k].appendChild(linkEl);
                }

                
// 判断是否存在修改样式,如果存在则把该单元个转化为修改按钮
                if(css.elementHasClass(table.tBodies[0].rows[j+1].cells[k], 'editbtn')) ...{
                    table.tBodies[
0].rows[j+1].cells[k].id = 'delbtn'+this.addbtnid ++;
                    
var linkEl = createElement('a');
                    linkEl.href 
= '#';
                    linkEl.onclick 
= this.editRow;
                    linkEl.set
分享到:
评论

相关推荐

    asp.net ajax留言板

    ASP.NET AJAX留言板是一种基于微软ASP.NET框架和AJAX(Asynchronous JavaScript and XML)技术实现的交互式用户界面组件。在网页应用中,AJAX技术允许数据在后台无刷新地异步加载,从而提供了更加流畅、高效的用户...

    ASP.NET实现的动态Menu

    ASP.NET 是微软公司推出的一种基于 .NET Framework 的服务器端网页开发技术,它为开发者提供了构建交互式、数据驱动的Web应用程序的强大工具。在ASP.NET中,动态Menu是一种常见的功能,用于创建可响应用户操作的菜单...

    一个基于C#+ASP.NET实现可以进行DataGrid全数据记录进行编辑维护的程序例子

    本示例程序"一个基于C#+ASP.NET实现可以进行DataGrid全数据记录进行编辑维护的程序例子"是针对DataGrid控件的一个具体应用,它允许用户在前端对表格中的所有数据进行编辑和维护,极大地提高了数据操作的便利性。...

    ASP.NET 4.0网站开发

    ASP.NET 4.0是微软推出的用于构建动态网站、Web应用程序和Web服务的框架,它基于.NET Framework 4.0,提供了丰富的功能和强大的性能优化。在这个“ASP.NET 4.0网站开发入门教程”中,我们将深入探讨该技术的核心概念...

    asp.net+用ajax实现三级联动

    在ASP.NET中,使用AJAX实现三级联动是一种常见的交互式数据筛选技术,它可以在不刷新整个页面的情况下更新部分页面内容,提升用户体验。本实例主要涵盖了以下几个关键知识点: 1. **ASP.NET基础**:ASP.NET是...

    ASP.NET+ajax经典范例168+精选71例

    ASP.NET提供了丰富的控件、事件驱动模型以及强大的数据绑定机制,简化了网页开发流程。 AJAX,即Asynchronous JavaScript and XML,是一种创建动态网页的技术,通过在后台与服务器进行少量数据交换,使网页实现异步...

    ASP.NET+2.0与AJAX开发的完整网站

    ASP.NET 2.0 是微软推出的用于构建动态网站、Web应用程序和Web服务的框架,它在.NET Framework 2.0之上构建,提供了丰富的服务器端控件、数据绑定、事件驱动模型以及内置的安全特性。这个“ASP.NET+2.0与AJAX开发的...

    精美的ASP.NET日期选择器

    ASP.NET是一种基于微软.NET框架的Web应用程序开发平台,它提供了丰富的服务器控件、事件驱动的模型以及自动处理页面生命周期的功能。在ASP.NET中,我们经常需要处理用户输入的日期,这时日期选择器就显得尤为重要。...

    专家门诊ASP.net开发答疑200问

    1. **ASP.NET基础**:ASP.NET是微软公司推出的Web应用程序开发框架,基于.NET Framework或.NET Core,支持多种编程语言如C#、VB.NET等。它提供了强大的服务器控件、事件驱动模型以及自动页面生命周期管理,简化了Web...

    ASP.NET3.5动态网站开发基础教程

    ASP.NET 3.5是微软推出的用于构建动态网站和Web应用程序的框架,它基于.NET Framework 3.5,提供了一套强大的工具和语言支持,帮助开发者高效地创建交互式的、数据驱动的Web应用。本教程将带你深入理解ASP.NET 3.5的...

    asp.net 网站开发

    【ASP.NET 网站开发】是一个涵盖广泛的技术领域,主要使用Microsoft的.NET框架进行Web应用程序的构建。在这个过程中,开发者通常会结合多种技术来创建功能丰富的动态网站。以下是关于这个主题的一些关键知识点: 1....

    asp.net2.0开发指南 郝刚编 光盘

    《ASP.NET 2.0 开发指南》是郝刚编著的一本专业书籍,它深入浅出地介绍了ASP.NET 2.0这一重要的Web应用程序开发框架。ASP.NET 2.0是微软.NET Framework 2.0的一部分,为开发者提供了丰富的功能和强大的工具,用于...

    基于Asp.net的小型购物网站.rar

    Asp.net是由微软公司推出的一种强大的Web应用程序开发框架,它为构建动态、数据驱动的网站提供了丰富的工具和功能。在这个基于Asp.net的小型购物网站项目中,我们可以深入探讨以下几个核心知识点: 1. **MVC架构**...

    基于asp.net的图书管理系统

    【基于ASP.NET的图书管理系统】是一个使用C#编程语言实现的Web应用程序,它结合了ASP.NET框架的强大功能,为管理图书信息提供了全面的解决方案。这个系统不仅涵盖了基本的图书信息录入、查询、修改和删除等功能,还...

    ASP.NET 3.5网站开发项目实战

    ASP.NET 3.5是微软推出的用于构建动态网站、Web应用程序和Web服务的框架,它基于.NET Framework 3.5版本。在这个项目实战教程中,我们将深入探讨ASP.NET 3.5的核心特性和最佳实践,旨在帮助开发者掌握高效、安全且可...

    校友录系统实例开发附源码 (ASP.NET 3.5实现)

    1. **ASP.NET架构**:ASP.NET 3.5基于.NET Framework 3.5,采用了事件驱动的编程模型,提供了一整套服务器控件、数据绑定机制和状态管理方案。开发者可以使用C#或VB.NET等语言进行开发,通过.aspx页面和.cs后台代码...

    基于asp.net的bbs系统

    【基于ASP.NET的BBS系统】是一个典型的网络论坛开发项目,它利用了Microsoft的ASP.NET技术来构建一个交互性强、功能完善的在线讨论平台。ASP.NET是.NET Framework的一部分,提供了丰富的服务器控件、事件驱动模型...

    asp.net(C#)留言版程序

    首先,ASP.NET是微软开发的一个用于构建Web应用程序的框架,它提供了丰富的服务器控件、事件驱动模型以及内置的州管理机制。C#是ASP.NET中常用的编程语言,具有面向对象的特点,语法简洁且功能强大。 在创建留言版...

    Asp.net开发的在线留言板

    【Asp.net开发的在线留言板】是一个基于ASP.NET技术实现的Web应用程序,它为用户提供了一个交互式的平台,允许用户进行在线交流,发表留言并查看他人的留言。此系统包括了登录、注册以及主界面等功能模块,是学习和...

    北大青鸟开发基于Ajax和控件技术的Web应用系统考试

    综上所述,"北大青鸟开发基于Ajax和控件技术的Web应用系统考试"涉及的是Web开发领域的核心技能,包括Ajax的异步通信和.NET框架下的控件技术。这些知识对于构建高性能、交互性强的Web应用至关重要。通过这个考试,...

Global site tag (gtag.js) - Google Analytics