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; });
}
});