【问题标题】:ASP.NET MVC 2: Any way to pass two Objects to a Template?ASP.NET MVC 2:有什么方法可以将两个对象传递给一个模板?
【发布时间】:2010-08-24 18:42:42
【问题描述】:

本例中的“查找”是州缩写的IList<string>。通常,您的域模型 POCO 不会包含这些选项。 ViewModel 通常负责引用原始域模型和 Lookup 对象,但是当域模型嵌套并且您使用 MVC 模板时会发生什么(它无法访问原始模型的根属性?

有没有办法将 Lookups 包含在一个对象中,并将 Model 包含在模板的不同对象中?是否允许在视图中即时组装特定于该模板的 ViewModel(必须包含来自那里的任何嵌套数据)?我认为下拉查找值的静态方法很糟糕。

有什么想法吗?

注意事项(据我所知):

存储库中的域模型 POCO 的结构不会发生变化。例如,如果您需要一个模型来同时拥有 Customer 对象和美国州的 DDL 选项,您通常有一个 ViewModel 引用 Customer 对象和 Customer Lookup 列表。

但是,当您有一个嵌套的域模型(聚合根)时,嵌套对象没有放置查找列表的位置,并且 MVC 模板无法访问根级视图模型(它们的视图模型是部分模型)。

编辑:

有没有办法将 DDL 列表放在 ViewModel 的根级别,然后当您到达 Customer 对象时,构造一个引用根级别 DDL 列表和当前 Customer 对象的新 ViewModel 发送到模板?这将消除模型中的重复数据,并为所有视图使用单个模型。唯一不好的是您视图中的控制器之类的数据汇编代码(同样糟糕)。

【问题讨论】:

  • 我不明白嵌套域模型和视图模型的问题。
  • 我投入了“笔记”来解释“嵌套查找”问题。

标签: asp.net-mvc-2 lookup-tables domain-model


【解决方案1】:

几个建议。首先,为您的视图使用单独的视图模型——不要直接使用您的域模型。这些视图模型可以而且应该携带视图所需的额外数据。其次,您可以使用DisplayFor/EditorFor 上的重载将额外的视图数据传递给模板。这样一来,您的模板可以特定于特定的域模型,并且可以访问视图模型中的其他数据。

【讨论】:

  • 在您嵌套了域模型之前,它非常有效。如果您有订单-> 客户,客户在其中获得自己的模板,模板如何访问美国州的选择?您必须为订单创建一个虚拟机,然后为客户创建一个子虚拟机,但在不更改其 POCO 的情况下,以某种方式将订单与客户关联到所涉及的虚拟机。
  • 这意味着 Order.OrderLine[0] 将变为类似于 OrderVM.Order.OrderLineVM[0].OrderLine 用于数据,OrderVM.OrderOptionsVM 用于订单选项列表和 OrderVM.Order.OrderLineVM [0].OrderLineOptionsVM 用于订单行选项。这意味着您将为数据中的每个 OrderLine 重复 DDL 列表。
  • @Dr. Zim - 如果您在调用 DisplayFor 时放入额外的视图数据,例如 DDL,这应该通过任何嵌套调用传播,因为它已添加到传递给模板的 ViewDataDictionary(反过来,它将传递给它呈现的任何模板)。这并不理想,因为它不再是强类型的,但我认为它应该可以工作。然后,您只需将其添加到顶级视图模型,然后将其添加为每个渲染模板的附加视图数据,例如,<%= Html.DisplayFor( m => m.Order, new { States = Model.StateList } ) %>
【解决方案2】:

对于静态、不变的列表,如状态缩写,您可以使用应用程序状态或缓存条目。这些类型的列表可以从数据库加载到 Application_Start 中。

【讨论】:

  • 不是一个坏主意,但如果您知道如何让模板也访问动态变化的选项列表,您可能会以同样的方式处理它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 2012-03-01
  • 2015-12-01
相关资源
最近更新 更多