zoukankan      html  css  js  c++  java
  • FlexiGrid+Mvc3示例(一)

    在WEB前端开发中,用到比较多的Grid插件,主要有FlexiGrid和JqGrid两大插件。这里,我想介绍一下FlexiGrid.

    首先我想介绍一下的是FlexiGrid的原理理论的知识。

    从FlexiGrid官方文档来看,他主要能够将JSON和XML格式的数据转换成Grid的能力,这里我们主要讲解JSON方式。

    FlexiGrid对于JSON格式,是有自身的一个格式规范的。一般是这样:

    {page:1,total:2,rows:[{Id:'c0509d34-e860-4698-91e5-210fab32dc2f',cell:['c0509d34-e860-4698-91e5-210fab32dc2f','True','4','31@qq.com']}
    ,{Id:'c0509d34-e860-4698-91e5-210fab32dc3f',cell:['c0509d34-e860-4698-91e5-210fab32dc3f','False','4','32@qq.com']}]}

    从格式上来看,我们传输的JSON主要有三个值,page,total,rows.其中page表示当前返回的页码,total表示数据的总条数,rows里面嵌套的是行对象。

    我们对于JSON的组装也主要是体现在rows这个节点上,rows可以包括众多的子对象,每个子对象为Table中的一行,或者理解为数据中的某一个实体。

    每一个Rows子对象包含2个子节点:Id和cell,Id表示当前数据行的Id,cell表示在前端需要展示的数据的值,其顺序与前端代码的显示顺序一一对应。

    下面我把组装Flexigrid格式的Json方法贴上:

    /// <summary>
            /// 将list转换成FlexiGrid约定格式的Json
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="obj"></param>
            /// <param name="page">当前页数</param>
            /// <param name="total">总量</param>
            /// <returns></returns>
            public static string GetFlexiGridJson<T>(List<T> obj, int page, int total)
            {
                string json = "page:{0},total:{1},rows:[{2}]";
                StringBuilder value = new StringBuilder();
                PropertyInfo[] propinfos = null;
                foreach (var i in obj)
                {
                    StringBuilder input = new StringBuilder();
                    if (propinfos == null)
                    {
                        propinfos = i.GetType().GetProperties();
                    }
                    foreach (PropertyInfo j in propinfos)
                    {
                        if (j.Name.ToLower() == "id")
                        {
                            input.AppendFormat("{0}:'{1}',cell:[", j.Name, j.GetValue(i, null));
                        }
                        input.AppendFormat("'{0}',", j.GetValue(i, null));
    
                    }
                    input.Remove(input.Length - 1, 1);
                    input.AppendFormat("]");
                    value.AppendFormat("{0},", "{" + input.ToString() + "}");
                }
                value.Remove(value.Length - 1, 1);
                json = "{" + string.Format(json, page, total, value) + "}";
                return json;
            }

    FlexiGrid的数据交互最重要的就是其JSON格式的组装。

    下面贴上关于FlexiGrid的参数说明:

     height: 200, //flexigrid插件的高度,单位为px
         'auto', //宽度值,auto表示根据每列的宽度自动计算,在IE6下建议设置具体值否则会有问题
        striped: true, //是否显示斑纹效果,默认是奇偶交互的形式
        novstripe: false,//没用过这个属性
        min 30, //列的最小宽度
        minheight: 80, //列的最小高度
        resizable: false, //resizable table是否可伸缩
        url: false, //ajax url,ajax方式对应的url地址
        method: 'POST', // data sending method,数据发送方式
        dataType: 'json', // type of data loaded,数据加载的类型,xml,json
        errormsg: '发生错误', //错误提升信息
        usepager: false, //是否分页
        nowrap: true, //是否不换行
        page: 1, //current page,默认当前页
        total: 1, //total pages,总页面数
        useRp: true, //use the results per page select box,是否可以动态设置每页显示的结果数
        rp: 25, // results per page,每页默认的结果数
        rpOptions: [10, 15, 20, 25, 40, 100], //可选择设定的每页结果数
        title: false, //是否包含标题
        pagestat: '显示记录从{from}到{to},总数 {total} 条', //显示当前页和总页面的样式
        procmsg: '正在处理数据,请稍候 ...', //正在处理的提示信息
        query: '', //搜索查询的条件
        qtype: '', //搜索查询的类别
        qop: "Eq", //搜索的操作符
        nomsg: '没有符合条件的记录存在', //无结果的提示信息
        minColToggle: 1, //允许显示的最小列数
        showToggleBtn: true, //是否允许显示隐藏列,该属性有bug设置成false点击头脚本报错。
        hideOnSubmit: true, //是否在回调时显示遮盖
        showTableToggleBtn: false, //是否显示【显示隐藏Grid】的按钮
        autoload: true, //自动加载,即第一次发起ajax请求
        blockOpacity: 0.5, //透明度设置
        onToggleCol: false, //当在行之间转换时,可在此方法中重写默认实现,基本无用
        onChangeSort: false, //当改变排序时,可在此方法中重写默认实现,自行实现客户端排序
        onSuccess: false, //成功后执行
        onSubmit: false, // 调用自定义的计算函数,基本没用      
        //Style
        gridClass: "bbit-grid"//样式          
    }, p);
    ----------------------------------------------------------------------------------------------
    2、支持ajax跨域:
        url中加callback=?
        后台获得callback函数的名字
        返回json数据格式为:print(callbackName+"("+jsonString+")");
    ----------------------------------------------------------------------------------------------
    3、Flexigrid(HUGO.CM修改版v1.1)使用说明:
        1、加载flexigrid。p:选项参数集合
            $(“”).flexigrid(p);
        2、重新加载数据。
            $(“”).flexReload(p);
        3、更改flexigrid参数。P:选项参数集合
            $(“”).flexOptions (p);
        4、隐藏/显示列。cid:列索引,visible:bool
            $(“”).flexToggleCol (cid, visible);
        5、绑定数据。Data:数据源
            $(“”).flexAddData (data);
        6、no select plugin by me 。不知道做什么用的
            $(“”).noSelect (p);
        7、重新指定宽度和高度。
            $(“”).flexResize(w,h);
        8、翻页。type:first、prev、next、last、input
            $(“”).changePage(type);
    ----------------------------------------------------------------------------------------------
    4、Flexigrid——colModel:
        属性名    类型    描述
        display    string    显示的列名
        name    string    绑定的列名
        sortable bool    是否可以排序
        align    string    对其方式
        width    int    列的宽度
        hide    bool    是否隐藏该列
        pk    bool    是否为主键标识、如果是则隐藏该列,值存入隐藏域中
        process    function    
        customValue function    自定义显示值。(如性别:数据库为Bit类型,通过customValue方法返回“男/女”)参数:value,i
    ----------------------------------------------------------------------------------------------
    5、Flexigrid——事件
        事件名        参数                    描述            返回值
        onDragCol    dcoln,dcolt                拖动列后触发         无
        onToggleCol    cid,visible                隐藏/显示列后触发    无
        onChangeSort    sortname,sortorder            自定义排序事件        无
        onChangePage    newp                    自定义翻页事件        无
        onSuccess    无                    数据获取成功时触发    无
        onError        XMLHttpRequest,textStatus,errorThrown   出现错误时触发        无
        onSubmit    无                    在获取数据前时触发    bool
        onRowSelect    this                    行选中事件        无
    ----------------------------------------------------------------------------------------------
    6、Flexigrid——buttons
        属性名        类型        描述
        name        string        按钮名称
        bgclass        string        样式
        onpress        function    点击触发的方法
        separator    bool        分割线
    ----------------------------------------------------------------------------------------------
    7、Flexigrid——searchitems
        属性名        类型        描述
        display        string        搜索类型下拉列表框:显示的列名
        name        string        搜索类型下拉列表框:绑定的列名
        isdefault    bool        是否为默认搜索类型
        //注:如果searchitems:true,则自动根据所有字段生成下拉列表框


    示例:

    1:在html中引用Jquery,FlexiGrid以及css:

     <link href="@Url.Content("~/Scripts/Assets/FlexiGrid(1.8.3JQ)/css/flexigrid.pack.css")" rel="stylesheet"
            type="text/css" />  
     <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <script src="@Url.Content("~/Scripts/Assets/FlexiGrid(1.8.3JQ)/flexigrid.js")" type="text/javascript"></script>


    2:配置FlexiGrid(以下参数配置请参加博客的参数列表)

        <script type="text/javascript">
            $(document).ready(function () {
                $("#TbInvitationCode").flexigrid({
                    url: "MembershipManager/GetInvitationCode?UseState=3&r=" + Date().toLocaleString(),
                    dataType: "json",
                    height: "auto",
                     "auto",
                    usepager: true,
                    title: "邀请码",
                    showtogglebtn: true,
                    userp: true,
                    rp: 20,
                    sortder: "asc",
                    sortname: "iso",
                    pagestat: '显示记录从{from}到{to},总数 {total} 条',
                    nomsg: '没有符合条件的记录存在',
                    errormsg: '运行错误',
                    hideOnSubmit: true,
                    colModel: [
                    { display: 'ID', name: 'id',  sortable: true, align: 'center' },
                    { display: '授权邮箱', name: 'Email', sortable: true, align: 'center' },
                    { display: '发送日期', name: 'CreateDate', sortable: true, align: 'center' },
                    { display: '注册日期', name: 'ActivationDate', sortable: true, align: 'center' },
            ],
    
                    buttons: [{ name: 'Add', bclass: 'add', onpress: undefined },
    
            { name: 'Delete', bclass: 'delete', onpress: undefined },
    
            { separator: true}],
    
                    searchitems: [{ display: '授权邮箱', name: 'Email' },
    
           { display: 'Name', name: 'name', isdefault: true}]
    
                });
            });
        </script>

    如上配置:
    colModel负责显示数据,其顺序对应JSON中Rows子对象的顺序,display表示显示的列名,sortable表示此列具备排序功能,hide表示此列是否显示(true/false),align表示字符对齐方式。

    3:C# Json输出Action

        public class MembershipManagerController : Controller
        {
            //
            // GET: /MembershipManager/
            public ActionResult Index()
            {
                return View();
            }
            public ActionResult SendInvitationCode()
            {
                return View();
            }
            public string GetInvitationCode()
            {
                int id = Convert.ToInt32(User.Identity.Name);
                int page = Convert.ToInt32(InputOperation.GetUriRequest("page"));
                UseState state = (UseState)Convert.ToInt32(InputOperation.GetUriRequest("UseState"));
                IInvitationCodeRepository Repository = ObjectContainerFactory.ObjectContainer.Resolve<IInvitationCodeRepository>();
                FlexiGridPager F = new FlexiGridPager(id,state);
                var list = Repository.GetInvitationCode(F);
                string json = JsonHelper.GetFlexiGridJson<InvitationCode>(list, page, list.Count);
                return json;
            }
        }
    public class JsonHelper
        {
            /// <summary>
            /// 将list转换成FlexiGrid约定格式的Json
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="obj"></param>
            /// <param name="page">当前页数</param>
            /// <param name="total">总量</param>
            /// <returns></returns>
            public static string GetFlexiGridJson<T>(List<T> obj, int page, int total)
            {
                string json = "page:{0},total:{1},rows:[{2}]";
                StringBuilder value = new StringBuilder();
                PropertyInfo[] propinfos = null;
                foreach (var i in obj)
                {
                    StringBuilder input = new StringBuilder();
                    if (propinfos == null)
                    {
                        propinfos = i.GetType().GetProperties();
                    }
                    foreach (PropertyInfo j in propinfos)
                    {
                        if (j.Name.ToLower() == "id")
                        {
                            input.AppendFormat("{0}:'{1}',cell:[", j.Name, j.GetValue(i, null));
                        }
                        input.AppendFormat("'{0}',", j.GetValue(i, null));
    
                    }
                    input.Remove(input.Length - 1, 1);
                    input.AppendFormat("]");
                    value.AppendFormat("{0},", "{" + input.ToString() + "}");
                }
                value.Remove(value.Length - 1, 1);
                json = "{" + string.Format(json, page, total, value) + "}";
                return json;
            }

    4:经过以上代码,可以将JSON字符串发送到客户端,但笔者发现,Flexigrid对于JSON数据获取时的AJAX方法的Success事件并不能接收到JSON字符串,所以理改Flexigrid插件如下:

    $.ajax({
                        type: p.method,
                        url: p.url,
                        data: param,
                        dataType: "html",//原为p.datatype
                        success: function (data) {
                            data = eval("(" + data + ")");//笔者增加
                            g.addData(data);
                        },
                        error: function (XMLHttpRequest, textStatus, errorThrown) {
                            try {
                                if (p.onError) p.onError(XMLHttpRequest, textStatus, errorThrown);
                            } catch (e) {}
                        }
                    });

    最终效果:

    因为案例导出不易,所以未能添加实际案例下载,请见谅。若有疑问请联系。

    更多WEB开发技术请加群:Asp.Net高级群 号码:261882616  博主以及同事和你共同探讨感兴趣的话题。

  • 相关阅读:
    MFC Bitmap::FromBITMAPINFO返回空问题
    String成员函数
    用xshell连接l自己的inux
    回调函数
    文件操作相关函数(POSIX 标准 open,read,write,lseek,close)
    Linux_GDB调试学习笔记
    程序中的一些限制(基于Linux系统C语言)
    第10课:[实战] Redis 网络通信模块源码分析(3)
    第09课:【实战】Redis网络通信模块源码分析(2)
    简单模拟多段线绘制Pline命令过程的撤销功能
  • 原文地址:https://www.cnblogs.com/lilin123/p/2957296.html
Copyright © 2011-2022 走看看