0

我在了解视图模型时遇到了一些麻烦,这往往会导致我误入歧途并在视图中进行计算,它是自我的,因此是意大利面条代码,或者我回到 ViewBag。我听说过的这两种方法都是不正确的。

我真的只首先使用 MVC 的数据库,所以我所有的网站都有一个 .EDMX 作为他们的模型。下面的代码返回一个 IEnumerable 订单列表,它工作正常,但我应该如何将总数相加,以便可以在列表末尾显示它们?目前我正在视图中的 foreach 语句中这样做。

public ActionResult SalesAll()
{
    var orderproductvariants = db.OrderProductVariants.Include("Order")
        .Include("ProductVariant")
        .Include("ProductVariant.Product")
        .Where(x => x.Order.PaidDateUtc != null)
        .OrderByDescending(x => x.PriceInclTax);

    return View(orderproductvariants.ToList());
}
4

1 回答 1

6

我建议为需要任何类型数据的每个视图创建一个 ViewModel。

在这种情况下,我会创建:

public class SalesAllViewModel
{
  IEnumerable<OrderProductVariant> _orderProductVariant;

  public SalesAllViewModel(IEnumerable<OrderProductVariant> orderProductVariant)
  {
    this._orderProductVariant = orderProductVariant;
  }
}

现在,如果您需要基于传递给视图的值的逻辑,请在模型中更改它们。

  public int SumOfSomethingInOrderProductVariant(int id)
  {
    return this._orderProductVariant
      .Where(opv.ID == id)
      .Sum(opv => opv.IntValue);
  }

这意味着逻辑在视图中的所有数据中都是一致的。如果您有多个区域使用视图中的某些逻辑显示相同的值,则很容易忘记并且必须在其他位置复制和粘贴(yeeesh)值。

使用 ViewBag 或 ViewData 通常是不受欢迎的,因为没有人知道控制器或视图中真正发生了什么,所有的魔法都隐藏在 View(Bag/Data) 中。

更新 1

请阅读模型-视图-控制器详细信息

ViewModel(只是 MVC 技术描述中的模型)与数据访问无关。它只是一个与实体框架、Oracle、XML 或任何其他数据存储/检索技术无关的POCO 。ViewModel 背后的目标之一是将视图与数据源分离。

现在更困惑的是代码优先方法,即。没有完善的数据库???

这个问题与 ViewModel 无关。这也是一个主观问题,所以没有充分的理由来回答它。

对于我正在使用的数据库,我似乎不需要所有的 Include("Order")

由于您提到了 EDMX 文件,我可以假设您在谈论实体框架。如何使用实体框架取决于您。如果您出于性能原因需要包含,请执行此操作,如果您不需要它提供的数据,请不要使用它。无论哪种方式,它都与 ViewModel 在 MVC 中的使用方式无关。

于 2013-10-14T00:25:35.463 回答