使用UIHint的ASP.NET MVC 3自定义显示模板 - 是否需要循环?

时间:2011-05-23 06:47:44

标签: asp.net-mvc asp.net-mvc-3 razor data-annotations display-templates

如果我有这样的 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来找到模板,这里有一个提示”。

3 个答案:

答案 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/