【问题标题】:Model Data Type versus View Control模型数据类型与视图控制
【发布时间】:2010-01-14 01:47:18
【问题描述】:

当模型属性的数据类型与我希望在表单中显示的数据类型大不相同时,我很难理解 MVC 的设计模式。我不确定逻辑应该去哪里。

意识到我不太确定如何提出这个问题,我想我会用一个具体的例子来解释它。

我有一张发票表,第二张表包含 InvoiceDetails。每个 InvoiceDetail 项目都有一个负责批准费用的所有者。给定的发票有一个或多个最终将在所有明细行上签字的人,以便可以批准发票。正在构建网站以提供审批功能。

在数据库中,我存储了批准行项目的人员的员工 ID。此架构为我提供了一个模型,该模型具有用于 Approved 列的 String 属性。

但是,我希望在网站上提供一个复选框,供员工单击以表明他们批准该行项目。

我想我的问题是——我该如何处理?传递给 View 的 Model 具有 String 属性,但传递回 Controller 的表单值将是 CheckBox 类型。我看到了两种可能的方式...

1) 创建一个新的模型对象来表示表单字段...比如 FormInvoiceDetails...让业务逻辑查询数据库,然后将结果转换为其他类型。然后在提交后,需要将表单值转换回来,以便更新原始模型对象。

2) 将原始 InvoiceDetails 集合传递给 View 并让代码在那里创建基于 String 属性的值呈现 CheckBox。我仍然不确定如何处理提交,因为我仍然需要将表单值映射回底层数据库对象。

如果不是这两种方法之一,也许还有第三种方法?

为了使情况更复杂(或者可能不是),我正在渲染表单以允许编辑多行(即集合)。

感谢任何人提供的任何见解。

【问题讨论】:

    标签: model-view-controller


    【解决方案1】:

    您需要一个 ViewModel,就像 @Justn Niessner 建议的那样。

    您的控制器从数据库加载完整的模型,仅将它需要的字段复制到 ViewModel 中,然后将 ViewModel 交给视图进行渲染。

    我会使用Automapper 进行从模型到视图模型的转换。它将所有繁琐的thingA.x = thingY.x; 代码自动化。

    Here is an additional blog post going over in detail the use of ViewModels in the Nerd Dinner sample.

    【讨论】:

      【解决方案2】:

      我相信您正在寻找的是 ViewModel。

      在您使用 ViewModel 的情况下,您可以设计 ViewModel 以匹配您需要在页面上显示的确切数据。

      然后,您可以使用 Controller 将数据从 Model 填充并映射到 ViewModel 中,然后再返回。

      Nerd Dinner ASP.NET MVC Example 有一些非常好的使用 ViewModel 的示例。

      【讨论】:

      • Nerd Dinner 中的示例,以及我在网上看到的示例,似乎都与将附加数据传递给视图有关,而不是转换要显示的数据。但是,您对使用 ViewModels 的建议似乎是最好的解决方案。谢谢。
      猜你喜欢
      • 2011-12-28
      • 1970-01-01
      • 2012-03-21
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      相关资源
      最近更新 更多