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 的内置模板智能能够发挥作用,看到它是一个IEnumerable东西,并努力调用我的模板 N 次,就像它通常在Html.DisplayFor没有提示的情况下所做的那样。

所以它看起来像[UIHint]覆盖了那个功能?

显然,我可以指向另一个接受集合和调用的模板Html.DisplayForModel(),基本上模拟 MVC 智能。但我希望避免这种情况。老实说,我宁愿做一个 foreach 循环,也不愿拥有那 1 行“包装器”模板。

有更好的想法吗?

就像我想说:“嘿 MVC,为这些人中的每个人渲染一个模板。但不是使用名称约定来查找模板,这里有一个提示”。

4

3 回答 3

7

UIHint 的意思是“使用名为 XXX 的模板渲染这个模型”。所以你必须声明你的显示模板“SomeTemplate”

@model MvcApplication1.Models.ICollection<SomeViewModel>

并在 foreach 中显示每个项目。

于 2011-05-23T06:53:59.787 回答
3

另一种方法是传递字符串模板名称,如下所示

@Html.DisplayFor(model => model.Submodel, "SomeTemplate")
于 2013-06-07T14:23:15.597 回答
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 回答