给定一个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,使用经典 (创建没有问题)CodeTextBoxHtmlHelper.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 管理排序和分页,所以我的控制器和服务层不需要知道分页和排序。
是不是更清楚了?