带有 UIHint 的 ASP.NET MVC 3 自定义显示模板 - 需要 For 循环吗?
-
09-09-2020 - |
题
如果我有一个 视图模型 像这样:
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/