zoukankan      html  css  js  c++  java
  • 在Asp.net MVC使用jqGrid--代码少点再少点

    本示例显示了如何动态生成前端jqGrid代码,一般情况仅一行代码:

    <%=Html.jqGrid<TestModel>(@"#jqT", "Test", "/Home/GridData/")%>

    效果如下:

     

    还不仅仅如此,利用MetaData,将自动对不同实体对象进行捆绑,自动生成Grid。

     

    如果你想知道如何在asp.net MVC中使用jqGrid,请参考

    http://haacked.com/archive/2009/04/14/using-jquery-grid-with-asp.net-mvc.aspx

    看代码

    1、 扩展HtmlHelper来输出一段Javascript到客户端。

     

     

    代码
    复制代码
    public static class jqGridExtensions
        {
            public static string jqGrid<T>(this HtmlHelper helper, string gridID, string caption, string url)
            {
                if (gridID.Substring(0, 1) != "#")
                    gridID = "#" + gridID;
                string pagerID = string.Format("{0}_pager", gridID);
                StringBuilder sb = new StringBuilder();

                sb.AppendLine(" <script type="text/javascript">$(function(){");//jQuery(document).ready(function() {
                sb.AppendLine("$('%%GRIDID%%').jqGrid({".Replace("%%GRIDID%%", gridID));       //jQuery("#list").jqGrid({
                sb.AppendFormat("url:'{0}',", url);                            //        url: '/Home/GridData/',
                sb.Append("datatype: 'json',mtype: 'GET',");                 //        datatype: 'json',mtype: 'GET',
                sb.AppendFormat("colNames:[{0}],", GetColNames<T>());

                sb.AppendFormat("colModel:[{0}],", GetColModel<T>());
                sb.Append("pager: '%%GRIDPAGERID%%',rowNum: 20,rowList: [10, 20, 50,100],".Replace("%%GRIDPAGERID%%", pagerID));
                sb.AppendFormat("sortname:'{0}',sortorder: 'desc',", GetSortField<T>());
                sb.Append("viewrecords: true,imgpath: '/themes/redmond/images',");
                sb.AppendFormat("caption: '{0}'", caption);
                sb.Append("}); $('%%GRIDID%%').jqGrid('navGrid','%%GRIDPAGERID%%',{ edit: false, add: false, del: false });".Replace("%%GRIDID%%", gridID).Replace("%%GRIDPAGERID%%", pagerID));
                sb.Append("});</script> ");
                sb.AppendFormat("<table id="{0}" class="scroll" cellpadding="0" cellspacing="0"></table>", gridID.Substring(1));
                sb.AppendFormat("<div id="{0}" class="scroll" style="text-align:center;"></div>", pagerID.Substring(1));
                sb.AppendLine();
                return sb.ToString();
            }
    }
    复制代码

    上述代码隐含了3个函数来取得排序字段,Grid的列标题及ColModel。

     

    2、 对Grid的列标题及排序字段,ColModel进行定制。以GetColModel为例:

     

     

    代码
    复制代码
     private static string GetColModel<T>()
            {
                ModelMetadata metadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(T));

                StringBuilder sb = new StringBuilder();
                int width=100;
                foreach (ModelMetadata proMeta in metadata.Properties)
                {
                    ColWidthAttribute colWidthAttr = GetCustomAttribute<ColWidthAttribute>(proMeta) as ColWidthAttribute;
                    if (colWidthAttr != null)
                        width = colWidthAttr.Width;
                    sb.Append("{");
                    sb.AppendFormat("name:'{0}',index:'{0}',{1},align:'left'", proMeta.PropertyName, width);
                    sb.Append("},");
                }
                sb.Remove(sb.Length - 1, 1);
                return sb.ToString();
                //return "{ name: 'Id', index: 'Id',  140, align: 'left' }, { name: 'Votes', index: 'Votes',  180, align: 'left' },{ name: 'Title', index: 'Title',  400, align: 'left',editable:true}";
            }

            private static object GetCustomAttribute<T>(ModelMetadata proMeta) 
            {
                PropertyInfo property = proMeta.ContainerType.GetProperty(proMeta.PropertyName);
                object[] propertyAttributes = property.GetCustomAttributes(typeof(T), true);
                if (propertyAttributes.Length > 0)
                {
                    return (propertyAttributes[0]);

                }
                
                return null;
            }
    复制代码

     

    3、 扩展一个列宽(Column Width)属性。

     

     

    复制代码
     public class ColWidthAttribute: Attribute
        {
            public ColWidthAttribute()
            {

            }

            public int Width { get; set; }
        }
    复制代码

     

     

     

    4、 如何定制实体对象。

     

    代码
    复制代码
        [DisplayName("ID")]//暂时用这个来表示排序字段
        public class TestModel
        {
            [DisplayName("编号")]
            [ColWidth(Width=100)]
            public int ID{get;set;}

            [DisplayName("支持率")]
            [ColWidth(Width = 120)]
            public int Votes { get; set; }

            [DisplayName("议题")]
            [ColWidth(Width = 300)]
            public string Title { get; set; }

        }
    复制代码

     

     

    5、 Controller中的代码。

     

    代码
    复制代码
     public ActionResult GridData(string sidx, string sord, int page, int rows)
            {
                var jsonData = new
                {
                    total = 1, // we'll implement later 
                    page = page,
                    records = 3, // implement later 
                    rows = new[]{
                          new {id = 1, cell = new[] {"1", "-7", "Is this a good question?"}},
                          new {id = 2, cell = new[] {"2", "15", "Is this a blatant ripoff?"}},
                          new {id = 3, cell = new[] {"3", "23", "Why is the sky blue?"}}
                    }
                };
                return Json(jsonData,JsonRequestBehavior.AllowGet);
            }
    复制代码

    千万要记得JSon中设置JsonRequestBehavior.AllowGet,否则jqGrid中将只有表头没有数据。

    6、 前端代码。

     

     

    代码
    复制代码
    <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

    <asp:Content ID="aboutTitle" ContentPlaceHolderID="TitleContent" runat="server">
        About Us
    </asp:Content>

    <asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">
        <h2>About</h2>
        <p>
            Put content here.
        </p>
        <div>
        
        <%=Html.jqGrid<TestModel>(@"#jqT", "Test", "/Home/GridData/")%>
        </div>
    </asp:Content>
    复制代码

    看完,也许你会说这还叫代码少一点,我只是觉得这篇文章可能浪费你的时间。

    看完,也许你觉得这个例子威力太小,还想要能够自动支持在jqGrid上是否能够编辑,以及子表支持,等等~~~,我就觉得很欣慰了。

     

  • 相关阅读:
    Entity Framework中的多个库操作批量提交、事务处理
    Entity Framework with NOLOCK
    在Entity Framework 中执行T-sql语句
    Entity Framework Extended Library (EF扩展类库,支持批量更新、删除、合并多个查询等)
    Visual Studio 2010 更新NuGet Package Manager出错解决办法
    html判断IE版本
    Java基础-学习笔记(七)——this关键字
    Java基础-学习笔记(六)——类的封装性
    Java基础-学习笔记(五)——面向过程和面向对象的区别
    Java基础-学习笔记(四)-流程控制
  • 原文地址:https://www.cnblogs.com/webenh/p/6127916.html
Copyright © 2011-2022 走看看