0

共有ビューが共通の属性を読み取れるようにするために、よく知られている基本クラスを拡張する ViewModel があります。これは仕様によるものです。

モデルに含まれるエンティティのリストに関する詳細を表示するページもあります。次のコードに例を示します。

public abstract class AbstractViewModel {
      public Exception lastError; //If not null triggers a big warning
}

public class Cat{
      [Display(...)]
      public string Name;
}

public class CatListViewModel: AbstractViewModel {
      public IEnumerable<Cat> cats;
}

今、私の部分的なビューは、一般的な MVC の方法を使用して猫のリストを表示する必要があります

@model Org.Zighinetto.CatListViewModel

<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Cats.Name) //Doesn't work!!
        </th>
    </tr>
    @foreach (var item in Model.Cats)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
        </tr>
    }
</table>

残念ながらDisplayNameFor、コレクションを引数として使用することはできません

質問は

IEnumerable<Cat>上記のデータモデルを考えると、設計上の理由からモデルの性質を変更したくない...

Catクラスの属性である表示名を、DisplayNameFor特にこのコレクションが空の場合に式にコレクションが含まれる場合、メソッドまたは同等のものにバインドするにはどうすればよいですか? そうでなければ、上記のコンパイルエラーを修正するにはどうすればよいですか? DisplayNameForこの場合の正しい構文は何ですか?

4

2 に答える 2

0

null 例外を防ぐために、コードで注意する必要があることがいくつかあります。

まず、コレクションを初期化する必要がありますCats。これにより、正当な理由でコードがそうしない場合に、実際に発生した場合に、null 例外が発生しないように保護されます。したがって、モデルを次のように記述できます。

public class CatListViewModel: AbstractViewModel {
    public CatListViewModel() {
        Cats = new List<Cat>();
    }
    public IEnumerable<Cat> Cats;
}

したがって、ビューでModel.Cats.FirstOrDefault()は、null であるため、null 例外は発生しませんCats

次に、空のコレクション ( null ではない) を持つことができるようになったので、インスタンスのCatListViewModel作成時にコレクションを初期化しているため、null 例外が発生する可能性があります。NULLこれは、リストに項目がない場合にコンパイラに与えるように指示しているためです- Model.Cats.FirstOrDefault()。だからあなたがする必要があるのは:

<th>
    @if (Model.Cats.Any()) {
        @Html.DisplayNameFor(model => model.Cats.First().Name)
    }
</th>
于 2013-03-29T05:20:01.400 に答える
0

運良く自分で見つけました。

Html.DisplayNameFor(Model => Model.Cats.FirstOrDefault().Name)猫がいなくても、ランタイムはタイプCatを正しく反映するため、基本的に機能します

于 2013-03-28T23:36:49.690 に答える