46

MVC に次のモデルがあります。

public class ParentModel
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }

    public IEnumerable<ChildModel> Children { get; set; }
}

親モデルのすべての子を表示したい場合は、次のようにします。

@Html.DisplayFor(m => m.Children)

その後、ChildModel.cshtml 表示テンプレートを作成すると、DisplayFor がリストを自動的に反復処理します。

IEnumerable のカスタム テンプレートを作成したい場合はどうすればよいですか?

@model IEnumerable<ChildModel>

<table>
    <tr>
        <th>Property 1</th>
        <th>Property 2</th>
    </tr>
    ...
</table>

モデル タイプが間違っている表示テンプレートを作成し、モデル タイプが間違っていると文句を言わずにIEnumerable<ChildModel>呼び出すにはどうすればよいですか?@Html.DisplayFor(m => m.Children)

4

4 に答える 4

67

このような:

@Html.DisplayFor(m => m.Children, "YourTemplateName")

またはこのように:

[UIHint("YourTemplateName")]
public IEnumerable<ChildModel> Children { get; set; }

明らかにあなたが持っている場所~/Views/Shared/DisplayTemplates/YourTemplateName.cshtml

@model IEnumerable<ChildModel>

<table>
    <tr>
        <th>Property 1</th>
        <th>Property 2</th>
    </tr>
    ...
</table>
于 2011-11-03T21:31:27.423 に答える
3

実際の「有効な答え」は、-私見-質問に正しく答えていないことです。OPは、UIHintを指定せずにトリガーするリストテンプレートを作成する方法を探していると思います。

魔法のようなものはほとんど仕事をします

一部のマジックは、指定された typeの正しいビューをロードします。
いくつかの魔法は、指定されたタイプのコレクションに対して同じビューをロードします。指定されたタイプのコレクションに対して同じビューを反復する魔法 が必要です。

実際の動作を変更しますか?

お気に入りの逆アセンブラーを開きます。で魔法が発生しSystem.Web.Mvc.Html.TemplateHelpers.ExecuteTemplateます。ご覧のとおり、動作を変更するための拡張ポイントはありません。MVCへのプルリクエストが役立つかもしれません...

実際の魔法で行く

私はうまくいくものを思いつきました。表示テンプレートを作成します~/Views/Shared/DisplayTemplates/MyModel.cshtml

モデルを type として宣言しobjectます。

オブジェクトがコレクションの場合は、テンプレートを繰り返してレンダリングします。コレクションでない場合は、オブジェクトを表示します。

@model object

@if (Model is IList<MyModel>)
{
    var models = (IList<MyModel>)Model;
<ul>
    @foreach (var item in models)
    {
@Html.Partial("DisplayTemplates/MyModel", item)
    }
</ul>
} else {
    var item = (MyModel)Model;
    <li>@item.Name</li>
    }
}

DisplayForなしで動作するようになりましUIHintた。

于 2014-12-13T23:29:09.737 に答える