如果我有这样的 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的内置模板智能会启动,看到它是IEnumerable
的东西,并努力调用我的模板N次,就像它通常一样没有提示的Html.DisplayFor
。
所以看起来[UIHint]
会覆盖该功能吗?
显然我可以指向另一个接受该集合的模板,并调用Html.DisplayForModel()
,基本上模拟MVC智能。但我希望避免这种情况。老实说,我宁愿做一个foreach循环而不是那个1行“包装”模板。
有更好的想法吗?
就像我想说的那样:“嘿MVC,为每个人提供一个模板。但不是使用name-convention来找到模板,这里有一个提示”。
答案 0 :(得分:7)
UIHint表示“使用名为XXX的模板渲染此模型”。因此,您必须使用
声明您的displayTemplate“SomeTemplate”@model MvcApplication1.Models.ICollection<SomeViewModel>
并在foreach中显示每个项目。
答案 1 :(得分:3)
另一种方法是传递字符串模板名称,如下所示
@Html.DisplayFor(model => model.Submodel, "SomeTemplate")
答案 2 :(得分: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-knockout-js/