6

次のようなネストされたクラスがあります:

public class Jar
{
    public IEnumerable<NailClippings> Nails { set; get; }
    public IEnumerable<People> Donors { set; get; }
}

私のコントローラーは、文字列を次のように入力して、シングルJarをビューに渡します

@model Test.ViewModels.Jar

Nails私はこのようなものの内容をDonors簡単にループすることができます

@foreach(var item in Model.Nails)

私の問題は、HTMLヘルパーを使用して表示名を生成することです。

@Html.DisplayNameFor(model => model.Nails.Length)

内部のネストされたクラスのタイプをに変更し、クエリの最後にList追加し、行をに変更することで解決策を考え出しました。.ToList()

@Html.DisplayNameFor(model => model.Nails[0].Length)

名前を表示するために使用することを余儀なくされList、インデックスを持っていること[0]は私には間抜けです。内部のネストされたクラス属性を参照するための代替方法はありますか?

編集:表示

<table>
    <tr>
        <th>@Html.DisplayNameFor(model => model.Nails[0].Length)</th>
        .
        .
    </tr>
    @foreach(var item in Model.Nails){
    <tr>
        <td>@Html.DisplayFor(modelItem => item.Length</td>
        .
        .
    </tr>
    }
</table>
4

4 に答える 4

9

ビューにループを記述する必要はありません。それは彼らをとても醜くします。

コレクションタイプに対応する表示テンプレートを定義するだけです。したがって、たとえば~/Views/Shared/DisplayTemplates/NailClippings.cshtml、コレクションの1つの要素に強く型付けされる部分ビューを作成します。

@model NailClippings
<tr>
    <td>
        @Html.DisplayFor(x => x.Length)
    </td>
    .
    .
</tr>

メインビュー内では、次のように簡単です。

@model Jar
<table>
    <thead>
        <tr>
            <th>Length</th>
            .
            .
        </tr>
    </thead>
    <tbody>
        @Html.DisplayFor(x => x.Nails)
    </tbody>
</table>

ディスプレイ/エディタテンプレートは、慣例により機能します。したがって、ここで使用するメインビュー内@Html.DisplayFor(x => x.Nails)で、ASP.NET MVCはNailsプロパティの種類を分析し、それがIEnumerable<NailClippings>コレクションであることを確認します。したがって、最初に内部で対応する表示テンプレートの検索を開始し~/Views/CurrentController/DisplayTemplates/NailClippings.cshtml、次に内部~/Views/Shared/DisplayTemplates/NailClippings.cshtmlで検索を開始し、最後ににフォールバックしdefault display templateます。テンプレートを選択すると、コレクションプロパティの要素ごとにASP.NET MVCによってこのテンプレートが自動的に実行されるため、ビューにループを記述したり、インデックスを作成したりする必要はありません。

これはエディタテンプレートでも機能します:@Html.EditorFor(x => x.Nails)を検索し~/Views/Shared/EditorTemplates/NailClippings.cshtmlます。ここで得られるボーナスは、生成された入力フィールドに正しい名前が付けられ、フォームを送信すると、デフォルトのモデルバインダーが、HttpPostアクションがリクエストから引数として取っているビューモデルを自動的に再水和することです。

基本的に、フレームワークが従う規則を尊重すれば、あなたの生活はずっと楽になります。

于 2013-01-11T21:50:04.777 に答える
5

それ以外の

model.Nails[0].Length

あなたが使うことができます

model.Nails.First().Length

に変換する必要はありませんList

于 2013-01-11T20:45:27.700 に答える
2

itemループの変数だけでいいと思います

@Html.DisplayNameFor(model => item.Length)

更新別のオプションは、ネイル表示の部分ビューを作成することです。強く入力されIEnumerable<NailClippings>、すべてのプロパティが使用可能になります。

@Html.Partial("_Nails", Model.Nails)

ネイル部分ビュー:

@model IEnumerable<NailClippings>

<table>
    <tr>
        <th>@Html.DisplayNameFor(model => model.Length)</th>
        .
        .
    </tr>
    @foreach(var item in Model){
    <tr>
        <td>@Html.DisplayFor(modelItem => item.Length)</td>
        .
        .
    </tr>
    }
</table>
于 2013-01-11T20:31:11.677 に答える
0

このサンプルコードは、ネストされたモデルクラスに役立つと思います

@model ViewModels.MyViewModels.Theme

@Html.LabelFor(Model.Theme.name)
@foreach (var category in Model.Theme)
{
   @Html.LabelFor(category.name)
   @foreach(var product in theme.Products)
   {
      @Html.LabelFor(product.name)
      @foreach(var order in product.Orders)
      {
          @Html.TextBoxFor(order.Quantity)
          @Html.TextAreaFor(order.Note)
          @Html.EditorFor(order.DateRequestedDeliveryFor)
      }
   }
}
于 2013-01-11T21:38:10.317 に答える