将额外数据传递给EditorTemplate

时间:2011-08-11 20:32:39

标签: asp.net-mvc asp.net-mvc-3 razor mvc-editor-templates

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

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

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

我试图在使用ViewBag / ViewData技巧之前看看是否有一种强类型的方法。

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

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

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

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

1 个答案:

答案 0 :(得分:11)

我最近遇到了同样的问题并找到了this解决方案。

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

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

如果符合您的情况或者您找到任何其他解决方案,请告诉我。