在前一篇中,由于不懂jquery,前端做的太差了,今天做稍做修改,增加一个跳转到指定页面功能,表格行点击样式变化。并且在表格中加入bootstarp的按钮组,按钮点击后弹出模态框,须修改common,contorler,view。

在common中添加一个方法重载,以展示按钮组,另外还加了一个隐藏的Id列,需要增加两个参数,一个指定按钮的bootstarp样式,另一个数组指定按钮的名称

修改后的代码如下

using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json.Linq;

namespace OADemo.Common
{
    public class JsonStringHelper
    {
        /// <summary>
        /// 通过反射将列表中指定的属性值装配成多行多列的Html文本
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        /// <param name="propertyNames">要输出的属性名</param>
        /// <returns></returns>
        public static string GetTbodyHtmlString<T>(List<T> list,params string[] propertyNames)
        {
            StringBuilder sb = new StringBuilder();

            list.ForEach(o => {
                sb.Append(@"<tr>");//做一个行的开始
                var properties = o.GetType().GetProperties();//得到当前实体类型的所有属性
                foreach (var property in properties)
                {
                    if (propertyNames != null)
                    {
                        foreach (var name in propertyNames)
                        {
                            if (property.Name==name)
                            {
                                string id;
                                if(name=="Id")
                                {
                                    id = property.GetValue(o).ToString();
                                    sb.AppendFormat(@"<td hidden='hidden'>{0}</td>",id);
                                }
                                else
                                {
                                    sb.AppendFormat(@"<td>{0}</td>", property.GetValue(o).ToString());
                                }

                            }
                        }
                    }

                }
                sb.Append(@"</tr>");

            });
            return sb.ToString();
        }
        /// <summary>
        /// 通过反射将列表中指定的属性值装配成多行多列的json格式的Html文本
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        /// <param name="propertyNames"></param>
        /// <returns></returns>
        public static JObject GetTbodyJObjectStrin<T>(List<T> list, params string[] propertyNames)
        {
            return new JObject(new JProperty("tbodyJson", GetTbodyHtmlString(list, propertyNames)));
        }
        /// <summary>
        /// 通过反射将列表中指定的属性值装配成多行多列的json格式的Html文本
        /// </summary>
        /// <typeparam name="T">要展示的实体类型</typeparam>
        /// <param name="list">实体列表</param>
        /// <param name="btnNames">按钮的名称</param>
        /// <param name="btnClassName">按钮的样式类名</param>
        /// <param name="propertyNames">要展示的实体的属性名</param>
        /// <returns></returns>
        public static string GetTbodyHtmlString<T>(List<T> list,string[] btnNames,string btnClassName,
            params string[] propertyNames)
        {
            StringBuilder sb = new StringBuilder();

            list.ForEach(o => {
                sb.Append(@"<tr>");//做一个行的开始
                var properties = o.GetType().GetProperties();//得到当前实体类型的所有属性
                List<string> ids = new List<string>();
                foreach (var property in properties)//遍历所有公共属性
                {
                    if (propertyNames != null)
                    {
                        foreach (var name in propertyNames)
                        {
                            if (property.Name == name)//找出跟要展示的属性名
                            {
                                string id;
                                if (name == "Id")
                                {
                                    id = property.GetValue(o).ToString();
                                    sb.AppendFormat(@"<td hidden='hidden'>{0}</td>", id);//添加一个隐藏列
                                    ids.Add(id);
                                }
                                else
                                {
                                    sb.AppendFormat(@"<td>{0}</td>", property.GetValue(o).ToString());//添加其它列
                                }
                            }
                        }
                    }

                }
                ids.ForEach(i =>
                {
                    )
                    {
                        sb.Append(@"<td><div class='btn - toolbar' role='toolbar'");//bootstarp按钮组
                        foreach(var name in btnNames)//添加按钮组列
                        {
                            sb.AppendFormat(@"<div class='btn-group' role='group'>
                                           <button class='{0}'>{1}</button>
                                           </div>",btnClassName,name);
                        }
                        sb.Append(@"</div></td></tr>");
                    }
                });

            });
            return sb.ToString();
        }
    }
}

前端做的修改最多了,之前每一次指定页行数都 要提交两次Ajax请求,实在是太没有水平了,所以现在contorler里只要一个展示表格的方法就行了

修改后的控制器

using MTF.Domain;
using MTF.EFDatas;
using OADemo.BLL;
using OADemo.DataModel.Domains;
using System.Linq;
using System.Web.Mvc;
using Newtonsoft.Json.Linq;
using OADemo.Common;

namespace OADemo.MVCApp.Controllers
{
    public class HomeController : Controller
    {
        //找到相关实体的服务,这里我之前插入500多条数据
        private UserBll userService = DependencyContainer.Resolve<UserBll>();
        //把分页类当全局属性用
        private Pager<UserEntity,int> Pager { get { return userService.Pager; } }

        private string[] tabRowNames = new string[] {"Id", "Name", "Age", "RealName", "Email" };//要展示的所有属性

        string btnClassName = "btn-info";//指定按钮的bootstarp样式

        string[] btnNames = new string[] { "编辑", "删除" };//添加按钮的名称
        // GET: Home
        public ActionResult Index()
        {
            Pager.SetPageSize();//设置默认值

            ViewBag.PageSize = Pager.PageSize;//传值前台默认每页显示的行数

            ViewBag.PageCount = Pager.PageCount;//传值前台总页数

            var users = Pager.GetPageList(o => o.Id).ToList();//获取以Id排序的列表

            var result = JsonStringHelper.GetTbodyHtmlString(users,btnNames,btnClassName, tabRowNames);//装配tbody内容(非必要)

            return View(new MvcHtmlString(result));//前台非必要(可直接return View() )
        }
        /// <summary>
        /// 展示表格,类名取的不地道,懒的改了
        /// </summary>
        /// <param name="pageIndex">当前选中的页码 应该也做成可空类型,懒的改</param>
        /// <param name="pageSize">当前页的表格行数</param>
        /// <returns></returns>
        public ActionResult InitiaTable(int? pageIndex,int? pageSize)
        {
            //配置可空类型,如果前台没有数据传来,给一个默认值
             : pageSize);
            ;
            //根据前台参数取得相应的数据
            var users=Pager.GetPageList(index, size, o => o.Id).ToList();

            //配置json格式的html文本
            var result = JsonStringHelper.GetTbodyHtmlString(users, btnNames, btnClassName, tabRowNames);

            //配置前台必要的json格式数据,分别为页总数,表格内容,指定页的行数
            var jo = new JObject(new JProperty("pageCountJson", Pager.PageCount),
                new JProperty("tbodyJson", result),
                new JProperty("pageSizeJson",Pager.PageSize));

            return Content(jo.ToString());
        }

    }
}

修改后的前端

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="~/Content/bootstrap.min.css" rel="stylesheet" />
    <script src="~/scripts/jquery-1.9.1.min.js"></script>
    <script src="~/scripts/bootstrap.min.js"></script>
    <script src="~/scripts/jqPaginator.min.js"></script>
    <style type="text/css">
        .modal-content{
            background-color:#734BA9;
            color:white;
        }
    </style>
    <script type="text/javascript">
        var pageCount= @ViewBag.PageCount;//总页数
        var pageSize= @ViewBag.PageSize;//每页显示数量

        $(function () {  

            //加载分页
            LoadPager(pageSize,); 

            //设置每页行数按钮
            $("#btnSetPageSize").click(function(){

                var size=Number($("#pageSize").val());
                //当无值时给默认值
                ){
                    size=pageSize;
                }
                LoadPager(size,);
            })

            //跳转页面按钮
            $("#pageIndex").change(function(){
                //当输入框无值时,默认给1
                var index=Number($("#pageIndex").val());
                ){
                    index=;
                }
                LoadPager(pageSize,index);
            })

        })
        //单选时表格行的点击事件函数
        function SingleSelect(){
            if($(this).hasClass("success")){
                $(this).removeClass("success");
            }
            else{
                $(this).addClass("success").siblings().removeClass("success");
            }
        }

        //多选时表格行的点击事件函数
        function ManySelect(){
            if($(this).hasClass("success")){
                $(this).removeClass("success");
            }
            else{
                $(this).addClass("success");
            }
        }     

        //按钮的点击事件
        function OnTd_ButtonClick(){
            //如果是编辑按钮
            if($(this).text()=="编辑"){
                var values=new Array//用于存放当前行中列的内容的数组

                var td=$(this).parents("td");//找出当前按钮所在的列

                var uid=$(td).siblings("td:hidden").text();//获取隐藏列的内容

                var n=$(td).siblings("td:not(:hidden)").length;//不包含隐藏属性的其它(兄弟)列的数量

                ;a<n;a++){
                    values.push($($(td).siblings("td:not(:hidden)")[a]).text());//添加内容到数组
                }

                $(]);
                $('#addModal').modal('show')
                $("#btnEdit").click(function(){
                    $('#addModal').modal('hide')
                })
            }
            //如果是其它,这里只有两个所以直接else了
            else{

            }
        }
        //加载分页
        function LoadPager(size,index){
            $('#pager').jqPaginator({
                totalPages: pageCount,
                visiblePages: ,
                currentPage: index,
                first: '<li class="prev"><a href="javascript:;">首页</a></li>',
                prev: '<li class="prev"><a href="javascript:;">上一页</a></li>',
                next: '<li class="next"><a href="javascript:;">下一页</a></li>',
                page: '<li class="page"><a href="javascript:;">{{page}}</a></li>',
                last: '<li class="page"><a href="javascript:;">尾页</a></li>',
                onPageChange: function (num,type) {
                    //页码改变时的Ajax方法
                    $.post("/Home/InitiaTable/",
                        {pageIndex:num,pageSize:size},
                        //表格加载回调函数
                       function (data){                           

                           var json=eval("("+data+")");//转换JSON格式                           

                           var tbodyHtml=json.tbodyJson;//获取表格数据

                           //修改分页器的总页数
                           $('#pager').jqPaginator('option', {
                               totalPages: json.pageCountJson
                           });
                           if(num!=pageCount){
                               pageSize=json.pageSizeJson;//更新当前页的行数
                           }

                           pageCount=json.pageCountJson;//更新总页数                           

                           $("#table tbody").empty().append(tbodyHtml);//更新表格

                           $("#table tbody").children("tr").click(SingleSelect);//表格行的点击样式

                           $("#table tbody tr td button").click(OnTd_ButtonClick);//按钮的点击事件
                       })
                }
            });
        }       

    </script>
    <title>Index</title>
</head>
<body>
    <!--编辑模态框-->
    <div class="modal fade bs-example-modal-sm" id="addModal" tabindex="-1" role="dialog"
         aria-labelledby="addModalLabel" aria-hidden="true">
        <div class="modal-dialog">
            <div class="modal-content">
                <!--头部-->
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal"
                            aria-hidden="true">
                        ×
                    </button>
                    <h4 class="modal-title" id="addModalLabel"></h4>
                </div>
                <!--正文-->
                <div class="modal-body">
                    <form class="form-horizontal" role="form">
                        <div class="form-group">
                            <label for="userName" class="col-sm-2 control-label">用户名</label>
                            <div class="col-sm-10">
                                <input type="text" class="form-control" id="userName">
                            </div>
                        </div>
                        <div class="form-group">
                            <label for="nickName" class="col-sm-2 control-label">昵称</label>
                            <div class="col-sm-10">
                                <input type="text" class="form-control" id="nickName">
                            </div>
                        </div>
                        <div class="form-group">
                            <label for="email" class="col-sm-2 control-label">邮箱</label>
                            <div class="col-sm-10">
                                <input type="text" class="form-control" id="email">
                            </div>
                        </div>
                        <div class="form-group">
                            <label for="password" class="col-sm-2 control-label">密码</label>
                            <div class="col-sm-10">
                                <input type="password" class="form-control" id="pasword">
                            </div>
                        </div>
                    </form>
                </div>
                <!--尾部-->
                <div class="modal-footer">
                    <button type="button" class="btn btn-default"
                            data-dismiss="modal">
                        关闭
                    </button>
                    <button type="button" class="btn btn-primary" id="btnEdit">
                        提交更改
                    </button>
                </div>
            </div>
        </div>
    </div>

    <div class="container text-center" >        

        <!--表格面板-->
        <div class="row" >
            <div class="col-md-12">
                <div class="panel panel-primary">
                    <div class="panel-heading text-left">
                        用户列表
                    </div>
                    <div class="panel-body">  

                        <table class="table" id="table">
                            <thead>
                                <tr>
                                    <td>Name</td>
                                    <td>Age</td>
                                    <td>Email</td>
                                    <td>RealName</td>
                                    <td>Actions </td>
                                </tr>
                            </thead>
                            <tbody>
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
        </div>
        <!--分页组件-->
        <div class="row">
            <div class="col-md-7">
                <!--分页-->
                 <ul id="pager" class="pagination">
                   <li>

                   </li>
                 </ul>                    

            </div>
            <!--跳转到指定页-->
            <div class="col-md-2"style="margin-top:25px">
                <label for="pageIndex">跳转</label>
                <input type="text" style="width:40px" id="pageIndex"/>
            </div>
            <!--设定每页显示的数量-->
            <div class="col-md-3 " style="margin-top:25px">
                <label for="pageSize" >设置每页行数</label>
                <input type="/>
                <button type="button" class="btn-info" id="btnSetPageSize">设置</button> 

            </div>

        </div>

    </div>
</body>
</html>

看看效果,现在是指定到第9页,单击其中一行,添加了样式

后面的按钮组也出现了。现在只做了其中的“编辑”按钮点击事件,点击后弹出模态框

模态框中的用户名显示绑定的是当前点击的行的用户名。就做到这里了。后面的工作没有去实现了,实现也没有意义,只能当是玩玩,在这过程中起码对jquery有了入门级别的了解了,收获还是不小的。

这里看到一篇文章,用的刚好是这方面的专业插件。比自己瞎捣鼓的肯定要好些。标题跟我的差不多,不过他的多搜索功能,并且专业,我的全是自定义

MVC5 + EF6 + Bootstrap3 (11) 排序、搜索、分页

表格,分页就到此了,希望以后能有时间做一个真正简单的AODemo

哦,对了,前端有个BUG,我不知道是我代码的问题还是分页插件的BUG,就是有时候我点尾页或是其它跳得比较远的页面时,会找不到表格行的所有事件,就像是没有行存在,但是数据已经加载过来,并且没有错。这个问题不是百分百出现,只是常有,只要点一下其它不是表格的控件,或是再点一下页码,又会好。想了三天了,都想不出是什么原因。如果有幸有大牛经过,希望能指点一下迷津!!!

从头开始一步一步实现EF6+Autofac+MVC5+Bootstarp极简前后台ajax表格展示及分页(二)前端修改、添加表格行点击弹出模态框的更多相关文章

  1. 从头开始一步一步实现EF6+Autofac+MVC5+Bootstarp极简的实现前后台ajax表格展示及分页实现

    本来是想试着做一个简单OA项目玩玩的,真是不做不知道,一做吓死人,原来以为很简单的事情,但是做起来不是忘这就是忘那的,有的技术还得重新温习.所以还是得记录.免得哪天电脑挂了,就全没有了. 开始是看了园 ...

  2. 一步一步跟我学DeviceOne开发 - 仿微信应用(一,二,三)

    这是一个系列的文档,长期目标是利用DeviceOne开发一些目前使用广泛的优质手机应用,我们会最大化的实现这些应用的每一个功能和细节,不只停留在简单的UI模仿和Demo阶段,而是一个基本可以使用的实际 ...

  3. 一步一步学习SignalR进行实时通信_9_托管在非Web应用程序

    原文:一步一步学习SignalR进行实时通信_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信\_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信_9_托管在非We ...

  4. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](四)

    前言 上一篇<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](三)>,我们完成了: * 引用SqlSugar * ...

  5. 一步一步实现MVC5+EF6+Bootstarp+Autofac+NoSql实现OADemo 之登陆(一) 验证码 Captcha 之大插件小用

    不知何年何月才能完成OADemo啊,总之还是一步一步来吧,这段时间开始着手了,先做登陆.  前段时间研究了一下在CentOS7下安装Mysql和Memcached服务,并测试了用C#操作,结果还行. ...

  6. 【DG】[三思笔记]一步一步学DataGuard

    [DG][三思笔记]一步一步学DataGuard 它有无数个名字,有人叫它dg,有人叫它数据卫士,有人叫它data guard,在oracle的各项特性中它有着举足轻理的地位,它就是(掌声)..... ...

  7. WCF 一步一步 发布 WCF服务 到 IIS (图)

    WCF 一步一步 发布 WCF服务 到 IIS (图) 使用VS自带的WCFSVCHost(WCF服务主机)发布WCF服务,时刻开发人员测试使用. 下面我们来看一下如何在IIS中部发布一个WCF服务. ...

  8. 一步一步构建手机WebApp开发——页面布局篇

    继上一篇:一步一步构建手机WebApp开发——环境搭建篇过后,我相信很多朋友都想看看实战案例,这一次的教程是页面布局篇,先上图: 如上图所示,此篇教程便是教初学者如何快速布局这样的页面.废话少说,直接 ...

  9. 一步一步教你在 Android 里创建自己的账号系统(一)

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 大家在 ...

随机推荐

  1. JSON value

    JSON values can be: A number (integer or floating point) A string (in double quotes) A Boolean (true ...

  2. 当target属性在XHTML script中无效时

    <a href="#" target=_blank></a>target此属性能够使链接在新窗口打开,但是在XHTML script中无效时. 那么解决方案 ...

  3. TF-IDF算法

    转自:http://www.cnblogs.com/eyeszjwang/articles/2330094.html TF-IDF(term frequency–inverse document fr ...

  4. [LintCode] Divide Two Integers 两数相除

    Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...

  5. [zt]OpenCV2.1.0的安装

    下载和安装 OpenCV 2.1.0 2.添加库文件:打开VS 2008,选择菜单:Tools->options->Projects and Solutions >VC++ Dire ...

  6. Jquery中animate可以操作css样式属性总结

    可以用 animate() 方法来操作所有 CSS 属性吗? 是的,几乎可以!不过,需要记住一件重要的事情:当使用 animate()时, 必须使用 Camel 标记法书写所有的属性名,比如,必须使用 ...

  7. nyoj-71

    描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量.我们要尽量减少这次活动中的花销,所以要找出可以安置所有旅 ...

  8. C遇到的问题

    1. stdout-------printf输出到stdout,并在终端打印 stderr--------perror错误输出到stderr,并在终端打印 2. usleep(1)//代表一微妙 sl ...

  9. 故障处理-ORA-00376/ORA-01110

    数据库实例启动之后发现,9号数据文件发生故障,file 9 cannot be read at this time, ORACLE Instance ilndb2 (pid = 16) - Error ...

  10. github展示项目

    首先在原repo中创建一个gh-pages分支,然后把你master分支的东西都搬过来,将这个gh-pages作为你的HEAD主分支.如果想删掉master分支,需要在repo的settings中修改 ...