MVC学习笔记2--EasyUIGrid的简单封装

这个封装,首先需要理解HtmlHelper,他是MVC用来封装HTML代码的。

所以说,理论上就是一个字符串拼接在页面上的过程。因为在我理解看来MVC的本质就是还给页面纯净的HTML。

创建自己的HtmlHelper方法需要有三个注意的地方:

  1.类必须用Static修饰,

  2.命名空间必须是System.Web.Mvc(可以随便建一个类,改掉命名空间就行)

  3.方法的第一个参数必须是this HtmlHelper helper,否则不能用HTMLHelper访问

HtmlHelper中的方法返回值有两种,一种是返回string类型,一种是HtmlString类型

 1         public static string TableProduce(this HtmlHelper helper, int row, int col)
 2         {
 3             //返回值如果如下,就可以执行出不被编码化的代码,也就是在页面上显示一段JS代码
 4             return "<script>alert('a')</script>\n\r\n";
 5 
 6         }
 7         public static HtmlString TableProduce(this HtmlHelper helper, int row)
 8         {
 9 
10             //返回值如果是return new HtmlString("");就可以执行出被编码化的代码,也就是在页面上执行一段JS代码
11             return new HtmlString("<script>alert('A')</script>");
12         }

然后,完成EasyUI的Grid需要有三步:

  1.在页面上写一个正常的EasyUI的Grid,保证显示没有问题。

  2.将这些代码黏贴进自己创建的HTMLHelper类中,以字符串拼接的模式,将这些代码包括起来。

  3.将里面一些常用参数做成传入的参数值

  4.因为里面的行是不固定的,所以,我们需要传一个list进去,list里面包括了改行的列头,是否显示,绑定的字段等

  5.因为字段名是有可能复制错的,我们最好能做一个获取字段名的方法。

代码如下

 1 namespace System.Web.Mvc
 2 {
 3     public static class MyHtmlHelper
 4     {
 5         public static string TableProduce(this HtmlHelper helper, int row, int col)
 6         {
 7             //返回值如果如下,就可以执行出不被编码化的代码,也就是在页面上显示一段JS代码
 8             return "<script>alert('a')</script>\n\r\n";
 9 
10         }
11         public static HtmlString TableProduce(this HtmlHelper helper, int row)
12         {
13 
14             //返回值如果是return new HtmlString("");就可以执行出被编码化的代码,也就是在页面上执行一段JS代码
15             return new HtmlString("<script>alert('A')</script>");
16         }
17         /// <summary>
18         /// EasyUIGrid生成
19         /// </summary>
20         /// <param name="helper"></param>
21         /// <param name="list"></param>
22         /// <returns></returns>
23         public static HtmlString EasyUIGrid(this HtmlHelper helper, List<EasyUIColumn> list, string url)
24         {
25             string a = "<script>\n";
26             a = a + "$(function () { \n";
27             a = a + "    $(\"#grid\").datagrid({ \n";
28             a = a + "        nowrap: false, \n";
29             a = a + "        striped: true, \n";
30             a = a + "        height: 'auto', \n";
31             a = a + "        singleSelect: true, \n";
32             a = a + "        rownumbers: true, \n";
33             a = a + "        border: true, \n";
34             a = a + "        collapsible: false,  \n";
35             a = a + "        title: \"菜单列表\", \n";
36             a = a + "        iconCls: 'icon-edit',  \n";
37             a = a + "        url: '" + url + "', \n";
38             a = a + "        columns: [[ \n";
39             foreach (EasyUIColumn item in list)
40             {
41                 a = a + "            { \n";
42                 a = a + "                field: '" + item.field + "', \n";
43                 a = a + "                title: '" + item.title + "', \n";
44                 a = a + "                sortable: " + item.sortable.ToString().ToLower() + ", \n";
45                 a = a + "                width: " + item.width + ", \n";
46                 if (string.Format("{0}", item.formatter) != "")
47                 {
48                     a = a + "                formatter: function (value, row, index) { \n";
49                     a = a + "                    return \"" + item.formatter + "\"";
50                     a = a + "                } \n";
51                 }
52                 a = a + "            }, \n";
53             }
54             a = a.TrimEnd(',');
55             a = a + "        ]], \n";
56             a = a + "        pagination: true, \n";
57             a = a + "        pageSize: 10, \n";
58             a = a + "        pageList: [10, 20, 30], \n";
59             a = a + "        pageNumber: 1, \n";
60             a = a + "        frozenColumns: [[ \n";
61             a = a + "                { field: 'ck', checkbox: true } \n";
62             a = a + "        ]], \n";
63             a = a + "        pagePosition: 'bottom', \n";
64             a = a + "        sortName: 'iOrder', \n";
65             a = a + "        sortOrder: 'ASC' \n";
66             a = a + "    }); \n";
67             a = a + "    var p = $('#grid').datagrid('getPager'); \n";
68             a = a + "    $(p).pagination({ \n";
69             a = a + "        pageSize: 10,  \n";
70             a = a + "        pageList: [10, 20, 30],  \n";
71             a = a + "        beforePageText: '第',  \n";
72             a = a + "        afterPageText: '页    共 {pages} 页', \n";
73             a = a + "        displayMsg: '当前显示 {from} - {to} 条记录   共 {total} 条记录' \n";
74             a = a + "    }); \n";
75             a = a + "}) \n";
76             a += "</script>\n";
77             a += "<table id=\"grid\" width=\"100%\" style=\"border:0px;\"></table>\n\r\n";
78             return new HtmlString(a);
79 
80         }
81     }
82 }
MyHtmlHelper
 1     public class EasyUIColumn
 2     {
 3         /// <summary>
 4         /// 字段名
 5         /// </summary>
 6         public string field { get; set; }
 7         /// <summary>
 8         /// 标题名
 9         /// </summary>
10         public string title { get; set; }
11         /// <summary>
12         /// 长度
13         /// </summary>
14         public string width { get; set; }
15         /// <summary>
16         /// 输出格式化,需传入一个完整的HTML字符串,可以考虑出一个简单的多选项,用代码生成相关字符串
17         /// </summary>
18         public string formatter { get; set; }
19         /// <summary>
20         /// 是否展示
21         /// </summary>
22         public bool hidden { get; set; }
23         /// <summary>
24         /// 是否排序
25         /// </summary>
26         public bool sortable { get; set; }
27         /// <summary>
28         /// 针对传入的lambda表达式,获取表达式属性的字符串,如:p=>p.Name,就获取一个"Name",以此方法,防止出现传入的属性名写错
29         /// </summary>
30         /// <typeparam name="T"></typeparam>
31         /// <param name="expr"></param>
32         /// <returns></returns>
33         public static string GetPropertyName<T>(Expression<Func<T, object>> expr)
34         {
35             var rtn = "";
36             if (expr.Body is UnaryExpression)
37             {
38                 rtn = ((MemberExpression)((UnaryExpression)expr.Body).Operand).Member.Name;
39             }
40             else if (expr.Body is MemberExpression)
41             {
42                 rtn = ((MemberExpression)expr.Body).Member.Name;
43             }
44             else if (expr.Body is ParameterExpression)
45             {
46                 rtn = ((ParameterExpression)expr.Body).Type.Name;
47             }
48             return rtn;
49         }  
50     }
EasyUIColumn

这样,一个基本的EasyUIGrid封装的方法就做好了,页面上采用以下方式调用

1             ViewData["list"] = new List<EasyUIColumn>()
2             {
3                 new EasyUIColumn(){ 
4                     field=EasyUIColumn.GetPropertyName<Student>(p=>p.SName), title="学生姓名", sortable=true,width = "280", hidden=true, formatter = "<input type='text' id='txtText_\" + row.RowID + \"' name='txtText_\" + row.RowID + \"' value='\" + value + \"' style='border:1px solid #999999; width:150px;' />"
5                 },
6                 new EasyUIColumn(){ 
7                     field="SAge", title="学生年龄", sortable=true,width = "200", hidden=false
8                 }
9             };
Control层

1 @Html.EasyUIGrid(ViewData["list"] as List<MvcProject.Models.EasyUIColumn>, "")

 这里面还有很多可以封装的东西,但是小子我偷懒,就不写了。

这个东西,只是为了一些常用的页面展示数据,为了方便项目里一些重复用EasyUIGrid的地方做的。

但是,这东西的灵活性远远不如EasyUI高,万万不可本末倒置,什么都依赖这个。

如果将EasyUI的什么属性都封装进去,那为什么不用EasyUI本身呢?

posted on 2016-05-26 14:41  九羽  阅读(741)  评论(0)    收藏  举报

导航