10

假设我有一个 LineItem(来自过度使用的购物车示例),我想使用 EditorTemplate 呈现它。

我完全可以使用父视图(部分或其他)中的 @Html.EditorFor(m => m.LineItems) 来渲染它,但令人困惑的是传递一些额外数据的最佳方法(比如具有数据的 SelectList来自数据库)到模板。

显然,我不应该通过添加这些无关的项目来污染 LineItem 模型(但是从视图的角度来看这是必需的。)

在诉诸 ViewBag/ViewData 技巧之前,我试图查看是否有一种强类型的方法来执行此操作。

我已经尝试创建一个“LineItem”特定的视图模型来传递数据,但它会破坏 MVC 生成的名称并向集合添加一个额外的层(因为我将视图模型的 IEnumerable<> 传递给 EditorFor( ) 调用,而不是实际 LineItem 的 IEnumerable<>)

另外,这是对 EditorTemplate 的错误使用吗?LineItem 是否需要一个下拉菜单,其中包含来自数据库表的选项对于 EditorTemplate 来说太多?

请引导我走向 MVC 必杀技。在等待答案的同时,我将尝试其他想法!

澄清一下:我考虑使用 EditorTemplate 的原因是因为它为我提供了自动收集处理。否则整个 [id] 业务变得太粘。

4

1 回答 1

12

我最近面临同样的问题并找到了这个解决方案。

总而言之,您应该创建包含原始集合和所需支持数据的自定义视图模型。然后在调用自定义模板的视图中,您可以使用HtmlHelper扩展方法重载将支持数据传递给ViewData字典。然后,您可以从您的自定义模板中检索并使用它们 frin ViewData

我认为这是一个很好的解决方法,基本上这就是视图模型的用途,至少它比扩展或从原始类派生来为视图提供额外数据要好得多。

请让我知道它是否适合您的场景或您是否找到任何其他解决方案。

于 2011-08-12T15:14:50.773 回答