上一章主要是关于分页控件的原理,代码也没有重构。在这一章会附上小插件的下载链接,插件主要就是重构逻辑部分,具体可以下载源文件看下,源代码也有注释。为了测试这个插件是能用的,我弄了个简单的asp.net例子(vs 2010)。通过ajax根据每一页请求数据,数据是使用json格式进行传输,通过knockout.js绑定。在这里顺便推荐一下汤姆大叔的Knockout应用开发指南 ,是学习Knockout非常好的文章。

惯例:插件Demo        Asp.net Demo

效果图:

主要思路是通过分页控件的callback方法把  当前页  和  每页显示数量  传给pageselectCallback方法,pageselectCallback请求后台的getModel方法获取当前页的数据,然后数据通过knockout提供的方法把数据绑定到Html控件上。

一、定义请求数据方法

  1. [WebMethod]
  2. public static string getModel(string index, string pagesize)
  3. {
  4. int pageIndex = Int32.Parse(index);
  5. int pageSize = Int32.Parse(pagesize);
  6. Models models = new Models();
  7. IList<Model> allModels = models.getModels();//获取全部数据
  8. if (pageIndex > 0)
  9. {
  10. pageIndex = pageIndex * pageSize;
  11. }
  12. if (pageSize > (allModels.Count - 1 - pageIndex))
  13. {
  14. pageSize = allModels.Count - 1 - pageIndex;
  15. }
  16. var pageSysmenus = allModels.Skip(pageIndex).Take(pageSize).ToList<Model>();//根据页数和每页显示数量获取数据
  17. string thedata = JsonHelper.ObjDivertToJson(pageSysmenus);//把数据转成json格式
  18.  
  19. return thedata;
  20. }

  21. //获取总数
    [WebMethod]
  22. public static int getCounts()
  23. {
  24. Models models = new Models();
  25. IList<Model> allModels = models.getModels();
  26. int count = allModels.Count - 1;
  27. return count;
  28. }

二、knockout 绑定数据

  1. <table class="mytable" border="1" cellspacing="0">
  2. <thead style="background-color: #0AA403">
  3. <tr>
  4. <th>
  5. Id
  6. </th>
  7. <th>
  8. Name
  9. </th>
  10. <th>
  11. TrueName
  12. </th>
  13. <th>
  14. Sex
  15. </th>
  16. <th>
  17. Email
  18. </th>
  19. </tr>
  20. </thead>
  21. <tbody id="tChangeClor" data-bind="foreach: models">
  22. <tr>
  23. <td>
  24. <span data-bind="text: Id"></span>
  25. </td>
  26. <td>
  27. <span data-bind="text: Name"></span>
  28. </td>
  29. <td>
  30. <span data-bind="text: TrueName"></span>
  31. </td>
  32. <td>
  33. <span data-bind="text: Sex"></span>
  34. </td>
  35. <td>
  36. <span data-bind="text: Email"></span>
  37. </td>
  38. </tr>
  39. </tbody>
  40. </table>
  41. <table>
  42. <tr>
  43. <td id="Pagination" class="pagination">
  44. </td>
  45. </tr>
  46. </table>

data-bind绑定的字段要与后台model的字段一致,当然knockout不单只是这个功能,还有数据验证等功能,很好用的一个插件。

三、ajax 请求数据

  1. //定义knockout的viewmodel
    var viewModel = function () {
  2. var self = this;
  3. self.models = ko.observableArray();
  4. }
  5. var vm = new viewModel();
    //分页控件的callback方法,通过当前页和显示页数请求数据
  6. var pageselectCallback = function (page_index, pagesize) {
  7. var mydata = "{'index':" + page_index + ",'pagesize':" + pagesize + "}";//post到getPage.aspx/getModel的参数
  8. $.ajax({
  9. type: "post",
  10. url: "getPage.aspx/getModel",
  11. data: mydata,
  12. contentType: "application/json;charset=utf-8",
  13. dataType: "json",
  14. success: function (data) {
  15. var datas = data.d;
  16. mappingData(datas);
  17. },
  18. error: function (Request) {
  19. alert(Request.responseText);
  20. }
  21. });
  22. };
  23. var mappingData = function (data) {
  24. var mydata = ko.mapping.fromJSON(data);
  25. vm.models = ko.mapping.fromJS(mydata, {}, vm.models);//把json格式转换成object格式,赋值给models
  26. $('.mytable tbody tr:even').addClass('odd');
  27. };
  28. $(function () {
  29. var getCounts;
  30. $.ajax({
  31. type: "post",
  32. url: "getPage.aspx/getCounts",
  33. contentType: "application/json;charset=utf-8",
  34. dataType: "json",
  35. success: function (data) {
  36. var datas = data.d;
  37. getCounts = Math.ceil(datas / 2);//总页数,向上取整
    //调用分页控件插件
  38. $("#Pagination").pagination({
  39. pageSize: 2,
  40. current_page: 1,
  41. display_num: 10,
  42. edge_num: 3,
  43. counts_num:getCounts,
  44. callback: pageselectCallback
  45. });
  46. },
  47. error: function (Request) {
  48. alert(Request.responseText);
  49. }
  50. });
  51. ko.applyBindings(vm, document.getElementById('tChangeClor'));
  52. });

关于ko.mapping.fromJSON(data)还是ko.mapping.fromJS(data)的判断,如果data是string类型( data ='{"Id":1,"Name":"WinKi"}' )就用fromJSON,如果data是object类型( data = {Id:1,Name:"WinKi"} ) 就用fromJS。如果使用$.getJSON()获取数据可以把JSON格式转换成object格式。

这个只是测试例子,实际项目中获取数据部分可以根据存储过程来获取数据,或者把全部的数据先存到缓存中。这样就不会像我例子那样每次都要先查找所有的数据。

如果您觉得还不错,点个推荐吧。

转载请注明出处!谢谢!

C# 白话系列之——白话委托

 

今天看到首页有个委托的文章,但大都写的太专业,而且没有实用的例子场景。正好昨天做了一个有关委托的功能,所以也来凑个热闹,用白话掰掰

一、委托是什么

我们都知道数据类型,简单点的如,想给一个变量赋值整数,那就要定义一个 int类型的变量

  1. int var=5;

想给一个变量赋值字符串那就定义一个string类型的变量

  1. string var ="test";

复杂点的就是自己定义一个类,然后就可以定义类变量

  1. MyClass myClass= new MyClass();

现在我们有如下一个方法,怎样把这个方法可以赋值给一个变量呢?

  1. public string GetMessage(string messageType)
  2. {
  3. string ret = "";
  4.  
  5. switch (messageType)
  6. {
  7. case "error":
  8. ret = "错误消息";
  9. break;
  10. case "warning":
  11. ret = "警告消息";
  12. break;
  13. default:
  14. ret = "未知消息";
  15. break;
  16. }
  17. return ret;
  18. }

这个就要委托来登场了。先看实现

  1. delegate string MessageDelegate(string messageType);
  2. public void Test()
  3. {
  4. MessageDelegate myMessage = GetMessage;
  5.  
  6. string ret = myMessage("error");
  7. }
  1. 定义一个类大家都会 ,用 class 关键字来定义一个类MyClass
  1. class MyClass
  2. {
  3. }

同理,用 delegate 关键字来定义一个委托 MessageDelegate。

一定要有这个一个概念,我们用 delegate 关键字定义的委托(MessageDelegate)是一个数据类型。

int 类型的变量用来赋值整数的,string类型的变量用来赋值字符串的,而委托类型的变量是用来赋值函数的。

当然因为每个函数的参数不同,返回的数据不同,所以在定义委托的时候也就指明了这个委托类型的变量可接受的函数。

  1. delegate string MessageDelegate(string messageType);

如上面定义的MessageDeletegate委托数据类型,用MessageDeletegate定义的变量(myMessage)只能接受 有一个string类型的参数并且有一个sting返回值的函数(GetMessage)

  1. MessageDelegate myMessage = GetMessage;
  1. delegate void MyDelete(int i);

上面定义的这个MyDelete委托类型对应的函数是有一个int类型的参数,并且没有返回值。

二、委托的使用

在.net中委托基本随处可见,最常用的就是Action、Func和Predicate,它们分别有很多重载,自己可以看看。

  1. public delegate void Action();
  2. public delegate TResult Func<out TResult>();
  3. public delegate bool Predicate<in T>(T obj);

现在有这么一个功能:

现在有一个int类型的集合,把所有的偶数乘以2,输出到一个新集合中。

测试数据:

  1. List<int> myList = new List<int>();
  2. for (int i = 0; i < 10; i++)
  3. {
  4. myList.Add(i);
  5. }

普通方法实现:

  1. List<int> retList = new List<int>();
  2. for (int i = 0; i < myList.Count; i++)
  3. {
  4. if (myList[i] % 2 == 0)
  5. {
  6. retList.Add(myList[i] * 2);
  7. }
  8. }

用委托方法实现:

  1. List<int> retList = new List<int>();
  2.  
  3. myList.ForEach((data) =>
  4. {
  5. if (data % 2 == 0)
  6. {
  7. retList.Add(data * 2);
  8. }
  9. });

当然这个ForEach是.net提供的扩展方法,再加上lambda表达式实现。

这个还不足以说明委托的好处。

如果我们再把问题放宽点,现在有一个int类型的集合,如果里面的数字满足某个条件,则执行某个动作。

  1. public void MyOperation(List<int> myList, Func<int, bool> func, Action<int> action)
  2. {
  3. for (int i = 0; i < myList.Count; i++)
  4. {
  5. if (func(myList[i]))
  6. {
  7. action(myList[i]);
  8. }
  9. }
  10. }

现在在把第一个问题实现下:

  1. MyOperation(myList, (d) =>
  2. {
  3. return d % 2 == 0;
  4. }, (d) =>
  5. {
  6. retList.Add(d * 2);
  7. });

可以近一步写成扩展方法,这个有跑题有点远了。

上面这个例子主要是说明了一点:

委托是一个函数类型的数据类型(对比int是一个整数类型的数据类型),可以把委托当做参数变量来传递。

然而因为委托变量的值是函数,这样就可以把一个函数当做参数传递到另外一个函数中。

 

jquery 分页控件2的更多相关文章

  1. jquery 分页控件1

    jquery 分页控件(一) 以前一直都是用别人的分页控件,虽然用得很爽,但总觉的还是自己写个小插件比较好,这个插件效果.代码等都有参照别人完成的控件.即便功能并不是那么完善,扩展性也不好,bug或许 ...

  2. 自己写的简单的jQuery分页控件

    因为是内部项目,需要分页控件,网上找了一大堆,给领导一看,都说不行,原因很简单,太复杂,领导就想要个简单点的,类似百度的分页,可是自己也没写过Jquery控件,硬着头皮找了些资料,写了这个分页控件,目 ...

  3. jquery 分页控件(二)

    上一章主要是关于分页控件的原理,代码也没有重构.在这一章会附上小插件的下载链接,插件主要就是重构逻辑部分,具体可以下载源文件看下,源代码也有注释.为了测试这个插件是能用的,我弄了个简单的asp.net ...

  4. jquery 分页控件(一)

    以前一直都是用别人的分页控件,虽然用得很爽,但总觉的还是自己写个小插件比较好,这个插件效果.代码等都有参照别人完成的控件.即便功能并不是那么完善,扩展性也不好,bug或许还很多.个人觉得,适合自己用就 ...

  5. jquery 分页控件功能

      <script>        //分页         function getPageNum(num) {             $("#PageNum ul" ...

  6. jQuery.page 分页控件

    分享一下自己在项目中引用的Jquery分页控件 index.html内容 <!DOCTYPE html> <html lang="zh-cn" xmlns=&qu ...

  7. ajax 分页控件,基于jquery

    /* 分页插件,依赖jQuery库 version: 1.1.0 author: Harrison Cao release date: 2013-09-23 相对 v1.0版本 修正了分页居中 使用方 ...

  8. jQuery Pagination Plugin ajax分页控件

    <html> <body> <div id="datagrid"> </div> <div id="paginati ...

  9. 基于jquery扩展漂亮的分页控件(ajax)

    分页控件式大家在熟悉不过的控件,很多情况下都需要使用到分页控件来完成列表数据加载操作,在很多分页控件中有的编写麻烦,有的应用扩展比较复杂,有的分页控件样式比较丑陋,有的分页控件用户体验操作比较简单等等 ...

随机推荐

  1. 浅谈 js 正则字面量 与 new RegExp 执行效率

    原文:浅谈 js 正则字面量 与 new RegExp 执行效率 前几天谈了正则匹配 js 字符串的问题:<js 正则学习小记之匹配字符串> 和 <js 正则学习小记之匹配字符串优化 ...

  2. Linq入门演练---(1)基本用法-分组,排序,内连接

    这一节大家共同学习下LINQ的基本用法,主要包括LINQ的分组,排序,和内外连接. 1.分组 基本语法:  group element by key element 表示查询结果返回的元素,key表示 ...

  3. GG同步sqlserver报错一个案例 Invalid date format

    在里面Oracle表同步sqlserver时间,在sqlserver当应用程序数据的结束.您可能会遇到这个错误. 2014-05-17 17:20:24 WARNING OGG-01154 SQL e ...

  4. crawler_wireshark 过滤基础知识

    一.IP过滤:包括来源IP或者目标IP等于某个IP比如:ip.src addr==192.168.0.208  or ip.src addr eq 192.168.0.208 显示来源IP       ...

  5. Moq 和RhinoMocks

    Moq & RhinoMocks 使用Mock对象进行测试一般都会有以下三个关键步骤: 使用接口来描述需要测试的对象 为实际的产品代码实现这个接口 以测试为目的,在Mock对象中实现这个接口 ...

  6. JavaBean中DAO设计模式介绍

    一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是client,简单的来说就是浏览器. 2.显示层:JSP/ ...

  7. 【百度地图API】如何制作商圈地图?行政地图?

    原文:[百度地图API]如何制作商圈地图?行政地图? 摘要: 想要显示某一个区域,并且鼠标放上去,该区域就会变色.这时,你就需要巧用多边形覆盖物,和它的鼠标事件了! 快来看看去哪儿网的实例吧:http ...

  8. krpano音量控制(我们已经转移到krpano中国网站 krpano360.com)

    需求: 实现音量控制,这是官网的样例, 本文已经转移 到 krpano中文网 p=148">http://krpano360.com/? p=148 很多其它教程关注微信公众号 krp ...

  9. Excel 删除所有错误公式

    当前工作表的话可以F5-定位-公式-错误值 来选中所有含错误值的单元格,然后按delete删除. 多表的话没办法了,因为不能跨工作表多重选中,只能一页页的删,或者用vba编个宏来解决

  10. UIAutomator源码分析之启动和运行

    通过上一篇<Android4.3引入的UiAutomation新框架官方简介>我们可以看到UiAutomator其实就是使用了UiAutomation这个新框架,通过调用Accessibi ...