8

次のようなViewModelがある場合:

public class MyViewModel
{
   [UIHint("SomeTemplate")]
   public ICollection<SomeViewModel> Submodel { get; set; }
}

そして、次のような HTML の行を持つ厳密に型指定されたビュー:

@Html.DisplayFor(model => model.Submodel)

そして、このような署名を持つ表示テンプレート:

@model MvcApplication1.Models.SomeViewModel

「モデル項目のタイプは ですList<SomeViewModel>が、このディクショナリにはタイプのモデルが必要SomeViewModelです。」というエラーが表示されます。

これは理にかなっていますが、MVC の組み込みのテンプレート スマートが作動することを望んでいましIEnumerableHtml.DisplayFor

それで、[UIHint]その機能をオーバーライドするように見えますか?

Html.DisplayForModel()明らかに、コレクションを受け入れて を呼び出し、基本的に MVC スマートをエミュレートする別のテンプレートを指すことができます。しかし、私はそれを避けることを望んでいます。正直なところ、その1行の「ラッパー」テンプレートを使用するよりも、foreachループを実行したいと思います。

より良いアイデアはありますか?

私が言いたいのは、「ねえ、MVC、これらの人たちのそれぞれのテンプレートをレンダリングしてください。しかし、名前規則を使用してテンプレートを見つける代わりに、ここにヒントがあります」.

4

3 に答える 3

7

UIHintは、「XXXという名前のテンプレートを使用してこのモデルをレンダリングする」という意味です。したがって、displaytemplate「SomeTemplate」を次のように宣言する必要があります。

@model MvcApplication1.Models.ICollection<SomeViewModel>

そして、foreach内に各アイテムを表示します。

于 2011-05-23T06:53:59.787 に答える
2

私は同じ問題に遭遇しました。複合型の場合、UIHint はデフォルトで無視されるようです。動作をオーバーライドできますが、簡単ではありません。したがって、より簡単な解決策は次のようになります。

1) UIHint アノテーションを削除します。2) 代わりに、表示テンプレート ファイルの名前が、Html.DisplayFor を自動的に反復処理する型名として指定されていることを確認してください。したがって、あなたの場合、表示テンプレート ファイルに SomeViewModel.cshtml という名前を付けます。これはうまくいくはずです。for ループを明示的に使用する必要はありません。MVC4で試してみましたが、うまくいきました。

次のリンクから解決策を得ました: http://roysvork.wordpress.com/2012/12/09/dynamic-repeating-field-groups-in-asp-net-mvc-with-just-a-dash-of -ノックアウト-js/

于 2013-06-05T22:41:41.267 に答える