Expression<Func<T, TValue>>
(like m => m.Name
) とが与えられた場合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>
が列挙されます (順序、ページ付け) 。=>わかりました
したがって、5、10 List<T>
、または 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>
より明確ですか?