给定一个Expression<Func<T, TValue>>
(like m => m.Name
) 和 an index
,我希望能够将我的表达式转换为m => m[index].Name
)。我必须承认我被困住了......
如果您想要“为什么”(也许会找到更好的方法),我会给您实际的场景。
场景:想象一个服务器端可编辑网格(没有 javascript)。
我用一个看起来像这样的助手构建我的网格:
@(Html.Grid(Model)
.Columns(columns => {
columns.Edit(m => m.Name);
columns.Edit(m => m.Code);
})
.AsEditable());
模型是一个IQueryable<T>
m => m.Name
是一个Expression<Func<T, TValue>>
(TValue
是字符串)
m => m.Code
是一个Expression<Func<T, TValue>>
(TValue
是 int)
渲染视图时,我想显示一个 html 表单。被IQueryable<T>
枚举(顺序,分页)。=> 好的
所以我将有List<T>
5、10 或 20 个T
项目。
并且应该表示为Name
,使用经典 (创建没有问题)Code
TextBox
HtmlHelper.TextBoxFor(Expression<Func<T, TValue>>)
HtmlHelper<T>
但是因为我有一个列表,如果我想要正确的模型绑定,我不能直接使用m => m.Name
,但应该使用m => m[indexOfItem in List<T>].Name
编辑:更多细节:
所以假设我们有一个实体类
public class Test {
public int Id {get;set;}
public string Name {get;set;}
public string Code {get;set;}
}
然后,一个方法检索一个IQueryable<Test>
然后一个视图
@model IQueryable<Test>
@(Html.Grid(Model)
.Columns(columns => {
columns.Edit(m => m.Name);
columns.Edit(m => m.Code);
})
.AsEditable());
如您所见,作为参数给出的模型是IQueryable<Test>
。
m => m.Name
和
m => m.Code
只是模型的属性(我想在我的网格中显示为 TextBox)。
该模型是一个IQueryable<T>
(不是一个IEnumerable<T>
),因为 Grid 管理排序和分页,所以我的控制器和服务层不需要知道分页和排序。
是不是更清楚了?