利用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") %>效果图:
这里主要的地方就是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的智能提示显示出字段的名称,方便输入和编译器验证工作。