給定Expression<Func<T, TValue>>
(如m => m.Name
)和index
,我希望能夠將我的表達式轉換爲m => m[index].Name
)。我必須承認我被卡住了......將表達式m => m.Name轉換爲m => m [index]。名稱
如果你想要「爲什麼地獄」(也許找到更好的方法),我給你的實際情況。
場景:想象一下服務器端可編輯網格(沒有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)
當rende響我的看法,我想顯示一個HTML表單。 列舉了IQueryable<T>
(命令,分頁)。 => ok
所以我會有一個List<T>
的5,10或20 T
項目。
而且Name
和Code
應使用經典HtmlHelper.TextBoxFor(Expression<Func<T, TValue>>)
(沒有問題創造了HtmlHelper<T>
)
但正如我已經有了一個名單被表示爲TextBox
,如果我想正確的模型結合,我不能直接使用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
只是模型的屬性(我想顯示爲文本框在我的網格)。
該模型是IQueryable<T>
(而不是IEnumerable<T>
),因爲網格管理排序和分頁,因此我的控制器和服務層不需要知道分頁和排序。
更清楚了嗎?
您所使用的拉姆達的做法是正確的。鑑於列舉元素並渲染文本框。你想在哪裏「得到」indexOfItem? –
當爲我的網格的每一行調用HtmlHelper.TextBoxFor時。如果我使用Html.TextBoxFor(m => m.Code),它會生成''。但是我需要爲每一行指定一個獨特的ID和名稱,否則我的模型綁定將失敗(Post操作應該得到一個'List'作爲參數。我可以手動創建'input',但是尋找更優雅的方式。 .. –
如果你有索引,爲什麼不直接寫'columns.Edit(m => m [index] .Name);'?實際上問題是錯誤的,你不能變換'm => m.Name'進入'm => m [index] .Name'只是因爲'm'在這個上下文中並不是一個集合,所以我想你需要一個不同的轉換,但是我不太明白哪個。 –