5

これに関する他のトピックを見つけましたが、私が理解しようとしていることを理解できるものはありませんでした。

私は 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 で何をしますか? 式のこの最初の部分が重要になる他のケースはありますか?

この式を適切なデリゲートに変換できれば、正確に何が起こっているのかを理解するのにも役立つかもしれません。

どうもありがとう

4

2 に答える 2

2

私はあなたの混乱を理解しています。実際modelItem、変数はラムダ式で使用されることはありません。使用されるのはitem、外部コンテキストからクロージャにキャプチャされた変数です。変数は、ループで定義されたitem単なるローカル変数です。foreach

ちなみに、modelItem => item.Genre.NameASP.NET MVC ビューのような式が表示された場合は、通常、コーディング プラクティスが不適切であることを示しています。避けてください。インターネットには、そのような悪い例があふれています。本当。私はこれを見るのにうんざりしています。この習慣を根絶するのを手伝ってください。

変数が実際に使用される別の方法を次に示します。

@model IList<MvcMusicStore.Models.Album>
...

@for (var i = 0; i < Model.Count; i++) {
    <tr>
        <td>
            @Html.DisplayFor(x => x[i].Genre.Name)
        </td>
        ...
    </tr>
}

そしてさらに良い。なぜループを書くのですか?エディター/表示テンプレートを直接使用できる場合:

@model IEnumerable<MvcMusicStore.Models.Album>
...
@Html.DisplayForModel()

次に、モデル コレクションの各要素に対して ASP.NET MVC によって自動的にレンダリングされる表示テンプレートを定義します ( ~/Views/Shared/DisplayTemplates/Album.cshtml) 。

@model Album
<tr>
    <td>
        @Html.DisplayFor(x => x.Genre.Name)
    </td>
    ...
</tr>
于 2012-07-27T12:51:34.313 に答える
0

あなたの質問に答えられるかどうかはわかりませんが、右側の部分は、DisplayForどのプロパティが表示を作成するかを示すために使用されます。プロパティのタイプ (値の表示方法を選択するために使用) と値を決定するために使用されます。

TextBoxFor で使用すると、プロパティの名前を取得するためにも使用されるため、テキスト ボックスは適切な名前を取得できます。

多くの html-helper 拡張メソッドの式は実際には少し奇妙だと思いますが、文字列パラメーターとして書き留める必要なく、コードにこれらすべての情報を取得させる簡単な方法です (次の場合は失敗します)。コンパイル時エラーを発生させることなく、何かを変更しました)。

于 2012-07-27T12:51:43.670 に答える