在ASP.NET MVC 4中使用Kendo UI Grid

简介:

Kendo UI 是Telerik推出的一套based on jQuery 的 Framework,提供了很多控件(Menu 、Grid 、Combox等...), 底层以Html5 + jQuery 来打造,并且兼容于各大浏览器,包含IE7、IE8。相关介绍可以参考AJAX式数据清单的新选择-Kendo UI Grid。

以下内容参考台湾的黑老大的文章:在ASP.NET MVC 4中使用Kendo UI Grid

建立一个ASP.NET MVC 4专案
使用NuGet安装KendoUIWeb及KendoGridBinder


20120622122410197.png

创建SimMemberInfo Model类,放到Model目录下

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Drawing; 
using System.Reflection;

namespace MvcApplication2.Models 
{ 
    public class SimMemberInfo 
    { 
        public string UserNo; //会员编号 
        public string UserName; //会员名称 
        public DateTime RegDate; //注册日期 
        public int Points; //累积点数

        //模拟数据源 
        public static List<SimMemberInfo> SimuDataStore = null;

        static SimMemberInfo() 
        { 
            Random rnd = new Random(); 
            //借用具名颜色名称来产生随机数据 
            string[] colorNames = typeof(Color) 
                .GetProperties(BindingFlags.Static | BindingFlags.Public) 
                .Select(o => o.Name).ToArray(); 
            SimuDataStore = 
                colorNames 
                .Select(cn => new SimMemberInfo() 
                { 
                    UserNo = string.Format("C{0:00000}", rnd.Next(99999)), 
                    UserName = cn, 
                    RegDate = DateTime.Today.AddDays(-rnd.Next(1000)), 
                    Points = rnd.Next(9999) 
                }).ToList(); 
        } 
    }

}

要引用Kendo UI,需要载入必要的JS及CSS,编辑App_Start/BundleConfig.cs,加入以下程序:
         bundles.Add(new ScriptBundle("~/bundles/kendoUI").Include("~/Scripts/kendo/2012.1.322/kendo.web.min.js")); 
         //经实测,SytleBundle virtualPath参数使用"2012.1.322"会有问题,故向上搬移一层 
         //将/Content/kendo/2012.1.322的内容搬至Content/kendo下        
         bundles.Add(new StyleBundle("~/Content/kendo/css").Include("~/Content/kendo/kendo.common.min.css",      
             "~/Content/kendo/kendo.blueopal.min.css" 
             ));)

由于CSS文件路径会被当成图片文件的基准,原本Kendo UI的.css及图图片被放在~/Content/kendo/2012.1.322/下,理论上StyleBundle应设成"~/Content/kendo/2012.1.322/css”,才能引导浏览器到该目录下取用图文件。不幸地,我发现StyleBundle的virtualPath参数出现2012.1.322时,会导致Styles.Render("~/Content/kendo/2012.1.322/css”)时传回HTTP 404错误~ 为克服问题,我决定将2012.1.322目录的内容向上搬一层,直接放在~/Content/keno目录下,并将virtualPath设成"~/Content/kendo/css",这样就能避开问题。

在~/Views/Shared/_Layout.cshtml中:

<head> 
    <meta charset="utf-8" /> 
    <meta name="viewport" content="width=device-width" /> 
    <title>@ViewBag.Title</title> 
    @Styles.Render("~/Content/themes/base/css", "~/Content/css", "~/Content/kendo/css")  
    @Scripts.Render("~/bundles/modernizr")   
</head> 
<body> 
    @RenderBody()

    @Scripts.Render("~/bundles/jquery", "~/bundles/kendoUI") 
    @RenderSection("scripts", required: false) 
</body> 
</html>

在Index.cshtml的代码如下:
@section Scripts 
{ 
    <style> 
        body { font-size: 9pt; } 
        #dvGrid { width: 500px; } 
        span.hi-lite { color: red; } 
        #dvGrid th.k-header { text-align: center; } 
    </style> 
    <script> 
        $(function () { 
            //建立数据源对象 
            var dataSrc = new kendo.data.DataSource({ 
                transport: { 
                    read: { 
                        //以下其实就是$.ajax的参数 
                        type: "POST", 
                        url: "/Home/Grid", 
                        dataType: "json", 
                        data: { 
                            //额外传至后方的参数 
                            keywd: function () { 
                                return $("#tKeyword").val(); 
                            } 
                        } 
                    } 
                }, 
                schema: { 
                    //取出数据数组 
                    data: function (d) { return d.data; }, 
                    //取出数据总笔数(计算页数用) 
                    total: function (d) { return d.total; } 
                }, 
                pageSize: 10, 
                serverPaging: true, 
                serverSorting: true 
            }); 
            //JSON日期转换 
            var dateRegExp = /^\/Date\((.*?)\)\/$/; 
            window.toDate = function (value) { 
                var date = dateRegExp.exec(value); 
                return new Date(parseInt(date[1])); 
            } 
            $("#dvGrid").kendoGrid({ 
                dataSource: dataSrc, 
                columns: [ 
                    { field: "UserNo", title: "会员编号" }, 
                    { field: "UserName", title: "会员名称", 
                        template: '#= "<span class=\\"u-name\\">" + UserName + "</span>" #' 
                    }, 
                    { field: "RegDate", title: "加入日期", 
                        template: '#= kendo.toString(toDate(RegDate), "yyyy/MM/dd")#' 
                    }, 
                    { field: "Points", title: "累积点数" }, 
                ], 
                sortable: true, 
                pageable: true, 
                dataBound: function () { 
                    //AJAX数据Bind完成后触发 
                    var kw = $("#tKeyword").val(); 
                    //若有设关键词,做Highlight处理 
                    if (kw.length > 0) { 
                        var re = new RegExp(kw, "g"); 
                        $(".u-name").each(function () { 
                            var $td = $(this); 
                            $td.html($td.text() 
                           .replace(re, "<span class='hi-lite'>$&</span>")); 
                        }); 
                    } 
                } 
            }); 
            //按下查询钮 
            $("#bQuery").click(function () { 
                //要求数据源重新读取(并指定切至第一页) 
                dataSrc.read({ page: 1, skip: 0 }); 
                //Grid重新显示数据 
                $("#dvGrid").data("kendoGrid").refresh(); 
            }); 
        }); 
    </script> 
} 
<div style="padding: 10px;"> 
    关键词: 
    <input id="tKeyword" /><input type="button" value="查询" id="bQuery" /> 
</div> 
<div id="dvGrid"> 
</div>

HomeController.cs的Grid() Action :
      public JsonResult Grid(KendoGridRequest request, string keywd) 
      { 
          var result = SimMemberInfo.SimuDataStore.Where(o => o.UserName.Contains(keywd)); 
          return Json(new KendoGrid<SimMemberInfo>(request, result)); 
      }
 只要return Json(new KendoGrid<T>(KendoGridRequest, IEnumerable<T>)),余下的换页、排序,甚至字段过滤功能,就都交给KendoGridBinder全权处理啰!

本文来自云栖社区合作伙伴“doNET跨平台”,了解相关信息可以关注“opendotnet”微信公众号

目录
相关文章
|
5月前
|
Web App开发 缓存 JavaScript
JQuery Kendo UI使用技巧总结
JQuery Kendo UI使用技巧总结
38 4
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
38 7
|
2月前
|
Linux C# Android开发
一个开源、跨平台的.NET UI框架 - Avalonia UI
一个开源、跨平台的.NET UI框架 - Avalonia UI
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
53 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
46 0
|
3月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
3月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
118 0
|
3月前
|
前端开发 Linux API
Avalonia:一个.NET跨平台UI框架
Avalonia:一个.NET跨平台UI框架
118 0
|
6月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
78 0
|
6月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
324 5