代码改变世界

利用Lambda扩展ExtJS2MVC

2009-06-07 11:50  午夜瞎想  阅读(2667)  评论(3编辑  收藏  举报

上文利用泛型委托增加代码的优雅 扩展ExtJS (2) 针对ExtJS进行了抽象和包装.生成的效果如下:

界面:

ASPX:

<%=this.HtmlExtJs().ExtWindow(f=> { f.varid = "xx"; f.width = 500; f.height = 500; f.title = "添加"; })
        .AddItem(item=>
     {
         item.For<ExtJS.Net.Grid.ExtGridPanel>
         (f =>
             {
                 f.AddStore(store =>
                             {
                                 store.proxy = new ExtHttpProxy() { url = "/home/list" };
                                 store.reader = new ExtJsonReader()
                                    {
                                        fields = new List<ExtField>()
                                        {
                                            new ExtField(){name="leaf"},
                                            new ExtField(){name="text"}
                                        }
                                    };
                             });
                 f.AddColumns(cols =>
                          {
                              cols.For<ExtColumn>(col => { col.header = "金额"; col.sortable = false; col.dataIndex = "leaf"; });
                              cols.For<ExtColumn>(col => { col.header = "名称"; col.sortable = false; col.dataIndex = "text"; });
                          });
             });
     }).ToRender()
    %>
 
 

可以看到代码基本上和ExtJS类似,对于熟悉ExtJS的人很容易上手,但这样对于一些常用的Grid,没有那么多功能来说还是比较麻烦的。为什么要保留类似ExtjS的语法和结构呢,当然是为了是第二次扩展。

对于以上的代码看起来重复的地方就是对于字段的定义,我们可以通过Lambda表达式来进行进一步的优化。

先看一下实现后的效果

aspx:

 
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<CNCWeb.Entity.Tbl_DictItem>>" %>
<% =Html.Grid("Grid1",100,200,"关键字列表",Model).Columns(cols=>
    {
        cols.For(x => x.ItemName).Named("名称");
        cols.For(x => x.ItemID);
        cols.For(x => x.DictID);
    }).Url("/home/list2")
%>
效果图:

image

这里主要的地方就是For函数,通过For函数分析Lambda表达式的字段名称,然后对列进行添加,主要的代码如下:

public IGridColumn<T> For(Expression<Func<T, object>> propertySpecifier)
        {
            string inferredName = ExpressionToName(propertySpecifier);
            var column = new GridColumn<T>(propertySpecifier.Compile(), inferredName);
            _columns.Add(column);
            return column;
        }
public static string ExpressionToName<TProperty>(Expression<Func<T, TProperty>> expression)
        {
            var memberExpression = RemoveUnary(expression.Body) as MemberExpression;
            return memberExpression == null ? null : memberExpression.Member.Name;
        }
        private static Expression RemoveUnary(Expression body)
        {
            var unary = body as UnaryExpression;
            if (unary != null)
            {
                return unary.Operand;
            }
            return body;
        }
通过for函数把名称添加的一个List集合里面,然后再添加到GridPanel的Columns里面
extGridPanel.AddColumns(cols =>
                {
                    foreach (var item in _gridModel.Columns)
                    {
                        cols.For<ExtColumn>(col => { col.header = item.Name; col.sortable = false; col.dataIndex = item.Field; });
                    }
                });
这样做对于常用的Grid还是很方便的,并且可以利用到vs的智能提示显示出字段的名称,方便输入和编译器验证工作。fingerscrossed