ASP.NET MVC 3 UIHINTを持つカスタム表示テンプレート - ループの場合は必須ですか?
-
09-09-2020 - |
質問
このような ViewModel がある場合:
public class MyViewModel
{
[UIHint("SomeTemplate")]
public ICollection<SomeViewModel> Submodel { get; set; }
}
.
と強い view このようなHTMLのラインで:
@Html.DisplayFor(model => model.Submodel)
.
と表示テンプレートこのような署名を持つ
@model MvcApplication1.Models.SomeViewModel
.
Model ItemはList<SomeViewModel>
の型であるが、この辞書の型はSomeViewModel
の型のモデルを必要とする。
MVCの組み込みのテンプレートスマートを開始したことを願って、それが何かのIEnumerable
であることを確認し、それが通常のHtml.DisplayFor
のためにそれがどのようにするかのようにヒント
それは[UIHint]
がその機能をオーバーライドするように見えますか?
明らかに私はコレクションを受け入れる別のテンプレートを指すことができ、基本的にMVCスマートをエミュレートするHtml.DisplayForModel()
を呼び出すことができます。しかし、私はそれを避けたいと思っています。正直なところ、その1行の「ラッパー」テンプレートを持つよりもむしろforeachのループをしたいと思います。
任意の良いアイデア?
それは私が言いたいようなものです: "ちょっとMVC、これらの人たちのそれぞれのためにテンプレートをレンダリングします。しかし、テンプレートを見つけるためにname-convantionを使用するのではなく、ここにヒントがあります"。
解決
UIHINTは、「このモデルをXXXという名前のテンプレートを使用してレンダリングする」という意味です。だからあなたはあなたのDisplayTemplate "SomeMemplate"を
で宣言しなければなりません@model MvcApplication1.Models.ICollection<SomeViewModel>
.
とForeach内の各項目を表示します。
他のヒント
代替案は、Stringテンプレート名をフォローとして渡すことです
@Html.DisplayFor(model => model.Submodel, "SomeTemplate")
. 私は同じ問題に遭遇しました。複雑なタイプのデフォルトでは、UIHINTは無視されているようです。行動を上書きすることができますが、それは簡単ではありません。だからより単純な解決策は次のとおりです。
1)UIHINT注釈を削除します。 2)代わりに、html.displayforが自動的に繰り返すタイプ名として指定されていることを確認してください。そのため、あなたの場合は、Display TemplateファイルをshownviewModel.cshtmlとして名前に付けます。これが機能するはずです。forループを明示的に使用する必要はありません。私はMVC4で試してみました。
次のリンクから解決策を得ました。 http://roysvork.wordpress.com/2012/12/09/dynamic-repeating-field-groups-in-asp-net-mvc-with-just-a-dash-of-ノックアウトJS /