【问题标题】:ASP.NET MVC 3 Custom Display Template With UIHint - For Loop Required?带有 UIHint 的 ASP.NET MVC 3 自定义显示模板 - 需要 For 循环吗?
【发布时间】:2011-08-30 22:16:19
【问题描述】:

如果我有这样的 ViewModel

public class MyViewModel
{
   [UIHint("SomeTemplate")]
   public ICollection<SomeViewModel> Submodel { get; set; }
}

还有一个强类型的View,上面有一行这样的HTML:

@Html.DisplayFor(model => model.Submodel)

还有一个带有如下签名的显示模板

@model MvcApplication1.Models.SomeViewModel

我收到一条错误消息,提示“模型项的类型为 List&lt;SomeViewModel&gt;,但此字典需要类型为 SomeViewModel 的模型。”。

这是有道理的,但我希望 MVC 的内置模板智能能够发挥作用,看到它是一个 IEnumerable 的东西,并计算出调用我的模板 N 次,就像它通常那样Html.DisplayFor 没有提示。

所以看起来[UIHint] 覆盖了该功能?

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

有更好的想法吗?

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

【问题讨论】:

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


    【解决方案1】:

    UIHint 表示“使用名为 XXX 的模板渲染此模型”。所以你必须用

    声明你的显示模板“SomeTemplate”
    @model MvcApplication1.Models.ICollection<SomeViewModel>
    

    并在 foreach 中显示每个项目。

    【讨论】:

    • 所以没有办法在使用 uihint 的同时利用 mvc 的内置模板智能(隐式循环)?
    • 不,据我所知。即使你想实现它,应该渲染什么来包围所有元素?在某些情况下它应该是一个表格,在其他情况下是一个 ul/ol。
    • 问题是,我已经有一个SomeViewModel 的显示模板,但我使用 UIHint 的原因是因为我想用新模板覆盖这个默认模板。集合的默认模板将简单地渲染单个模板 N 次。它不对 ul/table 做出决定。我只是想渲染一个 不同的 模板 N 次。但看起来如果没有 for 循环就无法完成,这有点糟糕。我总是尽量避免循环。
    • 好的,我明白了。看起来我的评论适用于 MVC2,您必须在其中使用 UIHint 进行集合。
    • Nps。我将把这个问题留一点,看看是否有更好的解决方案,否则我会接受这个。
    【解决方案2】:

    另一种方法是按如下方式传递字符串模板名称

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

    【讨论】:

    • 是的,让事情保持整洁真是太好了。也许一个例子会帮助人们开始。
    【解决方案3】:

    我遇到了同样的问题。看起来 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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 2011-09-11
      • 2015-04-22
      相关资源
      最近更新 更多