これに関する他のトピックを見つけましたが、私が理解しようとしていることを理解できるものはありませんでした。
私は MVC 3 を勉強していますが、スキャフォールディング テンプレートで @HTML.DisplayFor() を使用する Lambda 式に頭を悩ませています。
私は MvcMusicStore サンプル アプリケーションを使用しています。スキャフォールディングによって作成されたビューは次のようになります。
@model IEnumerable<MvcMusicStore.Models.Album>
...
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Genre.Name)
</td>
DisplayFor は HTML の拡張メソッドであり、式をパラメーターとして受け取ることを理解しています。私はラムダ式を調査し、列挙可能な文字列などの他のコンテキストでそれらを理解しました。例えば:
cities.Where(s => s.StartsWith("L"));
私の頭を悩ませているのは、2 番目の例では、式 (s) の最初の部分が実際には 2 番目の部分 (s.startswith..) で使用されているため、意味があり、プログラムがそれを使って何をしているのかがわかります。 . しかし、これは MVC 3 ビューには当てはまりません。modelItem はどこにも使用されていません。「modelItem」の名前を次のように変更してみました。
@Html.DisplayFor(iAmWearingShortPantsToday => item.Genre.Name)
このコードも同様に機能し、すべての項目と値が正しく表示されます。これは、この場合「modelItem」が実際に何かに使用されていることを疑います。しかし、なぜそこにあるのでしょうか。
また、この Lambda 式を次のようにデリゲート (省略形だと思います) に変換しようとしました。
@(Html.DisplayFor(delegate(IEnumerable<MvcMusicStore.Models.Album> modelItem) { return item.Genre.Name; }))
ただし、これは機能しません。結果のエラーは次のとおりです。
CS1946: 匿名メソッド式を式ツリーに変換できません
したがって、私の質問:
「modelItem」は何に適していますか? HTML.DisplayFor() は modelItem で何をしますか? 式のこの最初の部分が重要になる他のケースはありますか?
この式を適切なデリゲートに変換できれば、正確に何が起こっているのかを理解するのにも役立つかもしれません。
どうもありがとう