如果我有一个 视图模型 像这样:

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,为这些人中的每一个渲染一个模板。但这里有一个提示,而不是使用名称约定来查找模板”。

有帮助吗?

解决方案

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

@model MvcApplication1.Models.ICollection<SomeViewModel>

并在 foreach 中显示每个项目。

其他提示

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

@Html.DisplayFor(model => model.Submodel, "SomeTemplate")

我遇到了同样的问题。看起来复杂类型默认会忽略 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/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top